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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2013, 16:58   #1
КСВ
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 13
Печаль Нахождение общей точки двух прямых на плоскости

Народ, помогите найти ошибки в коде, вроде все по уму сделал, как настоящее только считает какую-то ерунду.
Задача следующая, имеется полилиния, задаваемая массивом k. По точкам этого массива строится массив FFig[0].Prmgs, где определяются коэффициенты уравнения прямых:
Код:
 
  result.A:=yk-yn;
  result.B:=xn-xk;
  result.C:=xk*yn-xn*yk;
Затем каждую линию мне нужно обнести прямоугольником. Я просчитываю углы каждого из них в массиве rst, который хранит информацию о координатах углов прямоугольника и о коэффициентах уравнений его боковых сторон:
Код:
for i:=0 to high(FFig[0].Prmgs)do
    begin
      setlength(rst,length(rst)+1);
      an:=FFig[0].Prms[i].A;
      bn:=FFig[0].Prms[i].B;
      l:=sqrt(sqr(an)+sqr(bn));
      l:=1/l;
      an:=an*l;
      bn:=bn*l;

      rst[high(rst)].x1:=-an*2+FFig[0].Prms[i].xn;
      rst[high(rst)].y1:=-Bn*2+FFig[0].Prms[i].yn;
      rst[high(rst)].x2:=An*2+FFig[0].Prms[i].xn;
      rst[high(rst)].y2:=Bn*2+FFig[0].Prms[i].yn;
      rst[high(rst)].x3:=An*2+FFig[0].Prms[i].xk;
      rst[high(rst)].y3:=Bn*2+FFig[0].Prms[i].yk;

      rst[high(rst)].x4:=-An*2+FFig[0].Prms[i].xn;
      rst[high(rst)].y4:=-Bn*2+FFig[0].Prms[i].yn;
      rst[high(rst)].x5:=An*2+FFig[0].Prms[i].xk;
      rst[high(rst)].y5:=Bn*2+FFig[0].Prms[i].yk;
      rst[high(rst)].x6:=-An*2+FFig[0].Prms[i].xk;
      rst[high(rst)].y6:=-Bn*2+FFig[0].Prms[i].yk;

      rst[high(rst)].A:=(rst[high(rst)].y6-rst[high(rst)].y1)/(rst[high(rst)].x6-rst[high(rst)].x1);
      rst[high(rst)].B:=1;
      rst[high(rst)].C:=-rst[high(rst)].A*rst[high(rst)].x1-rst[high(rst)].B*rst[high(rst)].y1;

      rst[high(rst)].k:=-rst[high(rst)].a/rst[high(rst)].b;
      rst[high(rst)].bb:=-rst[high(rst)].c/rst[high(rst)].b;
      //óðàâíåíèå ïðÿìîé ìåæäó òî÷àìè 2 è 5
      rst[high(rst)].A1:=(rst[high(rst)].y5-rst[high(rst)].y2)/(rst[high(rst)].x5-rst[high(rst)].x2);
      rst[high(rst)].B1:=1;
      rst[high(rst)].C1:=-rst[high(rst)].A*rst[high(rst)].x2-rst[high(rst)].B*rst[high(rst)].y2;

      rst[high(rst)].k1:=-rst[high(rst)].a1/rst[high(rst)].b1;
      rst[high(rst)].bb1:=-rst[high(rst)].c1/rst[high(rst)].b1;
    end;
на данном этапе все нормально и получается такая картинка:

Торчащие углы совсем меня не устраивают, поэтому я пишу корректировку - пытаюсь найти общую точку попарно для каждых из боковых сторон прямоугольника - приравниваю уравнения y=kx+b, решаю его, нахожу х, затем подставляю в одно из уравнений прямой, нахожу у. Полученные значения присваиваю точкам:
Код:
for i:=0 to high(rst)-1 do
    begin
      x1:=(rst[i+1].bb-rst[i].bb)/(rst[i].k-rst[i+1].k);
      x2:=(rst[i+1].bb1-rst[i].bb1)/(rst[i].k1-rst[i+1].k1);
      y1:=rst[i].k*x1+rst[i].bb;
      y2:=rst[i+1].k*x1+rst[i+1].bb;


      rst[i].x3:=x1;
      rst[i].y3:=y1;

      rst[i].x1:=x1;
      rst[i].y1:=y1;

      rst[i+1].x2:=x1;
      rst[i+1].y2:=y1;

      rst[i].x6:=x2;
      rst[i].y6:=y2;

      rst[i+1].x1:=x2;
      rst[i+1].y1:=y2;

      rst[i+1].x4:=x2;
      rst[i+1].y4:=y2;
    end;
получается дикая белиберда. я полагаю, что неправильно нахожу уравнения прямых, а именно, коэффициент С. Выводил сам, облазил кучу сайтов по компьютерной графике - вроде все верно. Потратил кучу времени на такую, вроде простую, задачу, поломал себе мозг. Поможите, люди добрыя!
КСВ вне форума Ответить с цитированием
Старый 07.02.2013, 15:38   #2
neeble
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 12
По умолчанию

а можеш на рисунке показать как ты хочеш чтоб было?
neeble вне форума Ответить с цитированием
Старый 07.02.2013, 17:56   #3
КСВ
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 13
По умолчанию

[IMG]
http://floomby.com/s1/BaYd4G
[/IMG]
ну вот как-то так
КСВ вне форума Ответить с цитированием
Старый 07.02.2013, 19:01   #4
neeble
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 12
По умолчанию

на да надо взять уравнение граней и прировнять

k-ето тангенс наклона прямой (у2-у1)/(x2-x1)
b- ето кагбы смешение находиться из подстоновки известной точки
например:известны 2 точки (x1,y1) и (x2,y2)

b:=y2-((у2-у1)/(x2-x1))*x2

х пересечения вроде так находиться
(b2-b1)/(k1-k2)

писал все с головы мб и нетак

Последний раз редактировалось neeble; 07.02.2013 в 19:12.
neeble вне форума Ответить с цитированием
Старый 08.02.2013, 14:02   #5
КСВ
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 13
По умолчанию

где тут кнопка "спасибо"? все так просто, я перемудрил)))
КСВ вне форума Ответить с цитированием
Старый 08.02.2013, 15:05   #6
КСВ
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 13
По умолчанию

все реально заработало
http://floomby.com/s1/Na4NGV

Помимо математики, у меня с нумерацией вершин бардак получился.
Просто, я видать слишком много времени потратил на математику, что простого под носом не увидел. Спасибо Огромное!!!
КСВ вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение точки пересечения двух отрезков [Паскаль] bnoazx005 Помощь студентам 0 18.12.2012 21:39
Задано множество прямых на плоскости darya17 C++ Builder 1 02.06.2011 06:28
Нахождение точки на медиане треугольника в координатной плоскости. Вадим Буренков Свободное общение 4 22.06.2010 19:18
Точки на плоскости, нахождение квадрата PastoriXx Общие вопросы .NET 6 28.05.2010 06:45
Нахождение трассы движения точки на плоскости Эмиль_C++ Общие вопросы C/C++ 4 20.04.2009 14:26