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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2009, 20:47   #1
Natasha666
 
Регистрация: 19.05.2009
Сообщений: 3
По умолчанию Программа должна вывести координаты точки пересечения прямых

Помогите, плиз, с задачкой:
Составить программу, которая выполняет следующую операцию: на фор-му произвольным образом наносятся две прямые, которые пересекаются. Программа должна вывести координаты точки пересечения этих прямых.

Natasha666 вне форума Ответить с цитированием
Старый 20.05.2009, 00:52   #2
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

Вот ссылка на код там образом вычисляется точка пересечения прямых.
http://forum.vingrad.ru/faq/topic-157574.html
В целом вывод наверное будет на холст формы (Canvas).
использовать придется Form1.Canvas.MoveTo(); Form1.Canvas.LineTo();
Form1.Canvas.PenPos.X; Form1.Canvas.PenPos.Y;
Сначала задаем координаты случайным образом для двух линий x, y через random. Запоминаем их. Вводим их в формулу которая на сайте и все практически готово.

Кстати вот в принципе накидал по быстрому рабочий код:
Код:
var
  Form1: TForm1;
  Point1,Point2,Point3,Point4:TPoint;
  ResultPoint:TPointFloat;
implementation

{$R *.dfm}

function Subtract(AVec1, AVec2 : TPoint) : TPoint;
begin
  Result.X := AVec1.X - AVec2.X;
  Result.Y := AVec1.Y - AVec2.Y;
end;


// determine if 2 line cross given their end-points
function LinesCross(LineAP1, LineAP2, LineBP1, LineBP2 : TPoint) : boolean;
Var
  diffLA, diffLB : TPoint;
  CompareA, CompareB : integer;
begin
  Result := False;

  diffLA := Subtract(LineAP2, LineAP1);
  diffLB := Subtract(LineBP2, LineBP1);

  CompareA := diffLA.X*LineAP1.Y - diffLA.Y*LineAP1.X;
  CompareB := diffLB.X*LineBP1.Y - diffLB.Y*LineBP1.X;

  if ( ((diffLA.X*LineBP1.Y - diffLA.Y*LineBP1.X) < CompareA) xor
       ((diffLA.X*LineBP2.Y - diffLA.Y*LineBP2.X) < CompareA) ) and
     ( ((diffLB.X*LineAP1.Y - diffLB.Y*LineAP1.X) < CompareB) xor
       ((diffLB.X*LineAP2.Y - diffLB.Y*LineAP2.X) < CompareB) ) then
    Result := True;
end;

function LineIntersect(LineAP1, LineAP2, LineBP1, LineBP2 : TPoint) : TPointFloat;
Var
  LDetLineA, LDetLineB, LDetDivInv : Real;
  LDiffLA, LDiffLB : TPoint;
begin
  LDetLineA := LineAP1.X*LineAP2.Y - LineAP1.Y*LineAP2.X;
  LDetLineB := LineBP1.X*LineBP2.Y - LineBP1.Y*LineBP2.X;

  LDiffLA := Subtract(LineAP1, LineAP2);
  LDiffLB := Subtract(LineBP1, LineBP2);

  LDetDivInv := 1 / ((LDiffLA.X*LDiffLB.Y) - (LDiffLA.Y*LDiffLB.X));

  Result.X := ((LDetLineA*LDiffLB.X) - (LDiffLA.X*LDetLineB)) * LDetDivInv;
  Result.Y := ((LDetLineA*LDiffLB.Y) - (LDiffLA.Y*LDetLineB)) * LDetDivInv;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Arect: TRect;
begin

 Arect.Top:=0;
 Arect.Left:=0;
 Arect.Right:=500;
 Arect.Bottom:=500;
 //очистка области
 Form1.Canvas.FillRect(ARect);

 randomize;
//для первой линии
  Point1.X:=random(500);
  Point1.Y:=random(500);

  Point2.X:=random(500);
  Point2.Y:=random(500);

//для второй линии
  Point3.X:=random(500);
  Point3.Y:=random(500);

  Point4.X:=random(500);
  Point4.Y:=random(500);


//рисуем линии
  Form1.Canvas.MoveTo(Point1.x,Point1.y);
  Form1.Canvas.LineTo(Point2.x,Point2.y);

  Form1.Canvas.MoveTo(Point3.x,Point3.y);
  Form1.Canvas.LineTo(Point4.x,Point4.y);

  //пересекаются ли

  if LinesCross(Point1, Point2, Point3, Point4) then
  begin
  ResultPoint:=LineIntersect(Point1, Point2, Point3, Point4);
    showmessage('Точка пересечения прямых('+floattostr(REsultPoint.x)+','+floattostr(REsultPoint.y)+')' );
  end;


end;
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.

Последний раз редактировалось ArtInt; 20.05.2009 в 01:20.
ArtInt вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать игровове поле, т.е. каждая клетка должна иметь свои параметры и координаты вида X Y kos1nus Помощь студентам 10 17.04.2009 16:22
Найти координаты хотя бы одной точки, попадающей в область, образованную тремя пересекающимися линиями. Zibiv Помощь студентам 1 03.10.2008 17:55
Как в TChart получить координаты точки на графике? Влажимир Общие вопросы Delphi 2 07.04.2008 15:37
Delphi 6 - Программа должна узнать уровень загруженности процессора Никки Общие вопросы Delphi 3 20.11.2007 19:40
WinApi, программа должна выдавать основной номер версии ОС MARGO Win Api 2 16.11.2007 21:14