Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2015, 11:47   #1
zaira001002
Форумчанин
 
Аватар для zaira001002
 
Регистрация: 13.09.2012
Сообщений: 122
По умолчанию Найти треугольник, пересекающий окружности

Дано множество треугольников и окружностей. Найти треугольник, стороны которого пересекают наибольшее количество окружностей.
Вот у меня реализована кнопка , которая выделяет красным цветом найденный треугольник.
Вот описание глобальных переменных:
Код:
procedure RedrawAll;

type
	// Тип "треугольник"
	TTriangle = record
		X1: Integer;
		Y1: Integer;
		X2: Integer;
		Y2: Integer;
    X3: Integer;
		Y3: Integer;
     X, Y: Integer;
	end;
  // Тип "окружность"
  TCircle = record
    X0: Integer;
    Y0: Integer;
    Rad: Integer;
  end;
var
  Form1: TForm1;

  SetT, SetC: Integer;      // Номер выбранного треугольника/окружности
 	KolTriangle, KolCircle: Integer;      // *Количество треугольников/ окружностей
	I,J: Integer;							// для циклов
	MouseX, MouseY: Integer;	// *Координаты мыши
	NewTriangle: array [1..6] of Integer;	// *Координаты треугольника через мышь
  CrP: array of TPoint;// Множество окружностей
  TrP: array of Point; // Множество треугольников
Вот кнопка и две процедуры , которые хранят в себе координаты точек
Код:
// Процедура сохранения точек всех окружностей
procedure DataCircles;
var
	X, Y, X1, Y1, X2, Y2, X3, Y3, X0, Y0, Rad: Integer;
  I, J, C: Integer;
begin
  with Form1.Image1.Canvas do
	begin
		Brush.Color := clWhite;
    Pen.Color := clWhite;
		Rectangle(0,0,Form1.Image1.Width,Form1.Image1.Height);
  end;
  Form1.Image1.Canvas.Pen.Color := clGreen;
  for I := 1 to Form1.ListBox1.Count do
		begin
			ExtractCircle(I,X0,Y0,Rad);// Процедура , которая считывает координаты окружности  из списка ListBox1
			CircleDraw(X0,Y0,Rad);// Процедура рисования окружности
		end;
  for I := 0 to Form1.Image1.Width - 1 do
    for J := 0 to Form1.Image1.Height - 1 do
      if Form1.Image1.Canvas.Pixels[I, J] = clGreen then
      begin
        SetLength(CrP, Length(CrP) + 1);
        CrP[C].X := I;
        CrP[C].Y := J;
        Inc(C);
      end;
  RedrawAll;// Процедура обновления изображений( рисует все треугольники и окружности из списков ListBox1 и ListBox2, в которых хранятся их координаты)
end;
// Процедура сохранения всех точек треугольника
procedure DataTriangle(NumTriangle: Integer);
var
	X1, Y1, X2, Y2, X3, Y3, X0, Y0, X, Y, Rad: Integer;
  I, J, T: Integer;
begin
  with Form1.Image1.Canvas do
	begin
		Brush.Color := clWhite;
    Pen.Color := clWhite;
		Rectangle(0,0,Form1.Image1.Width,Form1.Image1.Height);
  end;
  T := 0;
  SetLength(TrP, 0);
  Form1.Image1.Canvas.Pen.Color := clBlue;
  ExtractTriangle(NumTriangle,	X1, Y1, X2, Y2, X3, Y3);// Процедура , которая считывает координаты треугольника  из списка ListBox2
  TriangleDraw(	X1, Y1, X2, Y2, X3, Y3);// Процедура рисования треугольника
  for I := 0 to Form1.Image1.Width - 1 do
    for J := 0 to Form1.Image1.Height - 1 do
      if Form1.Image1.Canvas.Pixels[I, J] = clBlue then
      begin
        SetLength(TrP, Length(TrP) + 1);
        TrP[T].X:= I;
        TrP[T].Y := J;
        Inc(T);
      end;
  RedrawAll;Процедура обновления изображений( рисует все треугольники и окружности из списков ListBox1 и ListBox2, в которых хранятся их координаты)
end;
// *Кнопка нахождения€ треугольника
procedure TForm1.Button6Click(Sender: TObject);
var
  MaxI, Max, Kol: Integer;
  X1, Y1, X2, Y2, X3, Y3, X0, Y0, Rad: Integer;
  I, J, K, T, C, NumTriangle: Integer;
begin
  for I := 1 to Form1.ListBox2.Count do
		begin
      Kol:=0;
			NumTriangle := I;
      DataTriangle(NumTriangle);
      DataCircles;
      for J := 0 to  Form1.Image1.Height - 1 do
      begin
        for K := 0 to Form1.Image1.Width - 1  do
          if (TrP[K].X = CrP[K].X) and (TrP[J].Y = CrP[J].Y) then
            Inc(Kol);
      end;
      if Max < Kol then
        MaxI:= I;
		end;
  Form1.Image1.Canvas.Pen.Color := clRed;
  ExtractTriangle(MaxI,	X1, Y1, X2, Y2, X3, Y3);
  TriangleDraw(	X1, Y1, X2, Y2, X3, Y3);
end;
Я не очень разбираюсь в множествах, могли бы сказать, как правильно это записывать , в чем ошибки?(
zaira001002 вне форума Ответить с цитированием
Старый 26.09.2015, 18:27   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

представляешь, сколько времени нужно для разбора твоего кода? а жизнь одна, другой не будет. этим я хочу сказать, что быстрее с нуля написать.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.09.2015, 16:47   #3
zaira001002
Форумчанин
 
Аватар для zaira001002
 
Регистрация: 13.09.2012
Сообщений: 122
По умолчанию

хотя бы тогда скажи) как записать следующее на языке программирования правильно ) : задаем массив A))) где будем хранить все зеленые точки на экране, конкретнее в компоненте Image1) , и задаем другой массив B ) в котором будем хранить другие точки) точки треугольника. Теперь вот нужно только правильно записать цикл) в котором будем искать) совпадения координат зеленых точек с точками моего треугольника) Забудем про то задание) Могли бы просто написать хотя бы вот это?)))) а то я не совсем правильно пишу(
zaira001002 вне форума Ответить с цитированием
Старый 27.09.2015, 16:52   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Теперь вот нужно только правильно записать цикл) в котором будем искать) совпадения координат зеленых точек с точками моего треугольника
цикл поиска точки в массиве точек, штоль?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.09.2015, 18:16   #5
zaira001002
Форумчанин
 
Аватар для zaira001002
 
Регистрация: 13.09.2012
Сообщений: 122
По умолчанию

Да... И как задали вы эти массивы хранения координат точек тоже) если не трудно) то есть как обьявили вы их)
zaira001002 вне форума Ответить с цитированием
Старый 27.09.2015, 18:36   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
И как задали вы эти массивы хранения координат точек тоже
Код:
// ну, для простоты, пусть так
// красивое решение, имхо.
type
  TPoints = array of TPoint;
  TCallback = function(const Index: Integer): Boolean;
  
function FindPoints(const pts: TPoints; const p: TPoint; OnFind: TCallback): Integer;
var
  Index: Integer;
begin
  Result:= 0;
  
  for Index:= 0 to Length(pts) - 1 do
    if pts[Index] = p
      then begin
             Inc(Result);

             if Assigned(OnFind) and not OnFind(Index)
               then Break;
           end;
end;
Ахтунг! Аттеншн! Внимание! Увага!!! SHIT-CODE detected!!! Не отлаживал, писал на заборе!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 27.09.2015, 18:54   #7
zaira001002
Форумчанин
 
Аватар для zaira001002
 
Регистрация: 13.09.2012
Сообщений: 122
По умолчанию

Спасибо большое)
zaira001002 вне форума Ответить с цитированием
Старый 27.09.2015, 19:02   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Спасибо большое)
разберись сначала, как это порно работает.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить отрезок, пересекающий наибольшее количество прямоугольников Daniel0K Паскаль, Turbo Pascal, PascalABC.NET 4 17.02.2013 18:00
Найдите треугольник, у которого самый маленький радиус вписанной окружности(pascal) Pinap Помощь студентам 1 23.10.2012 13:26
Вписывание окружности в треугольник (Delphi) stimswall Помощь студентам 10 19.03.2009 20:14
Найти площадь треугольник (задача в делфи) YO$YA Помощь студентам 5 19.11.2008 21:29