Консультация № 182051
30.01.2011, 22:19
53.02 руб.
0 19 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
как проверить пересекаются ли вектора в пространстве вот код программы:

procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:integer;
a,b:integer; //центр координат
ix,iy,jx,jy,kx,ky:integer; {оси}
ax1,ax2,ax3,ax4,by1,by2,by3,by4,cz1,cz2,cz3,cz4:integer;
a_x1,a_x2,a_x3,a_x4,b_y1,b_y2,b_y3,b_y4:integer; //переменные для построения вектора в пространстве
begin
showmessage('введите координаты начала и конца векторов');
a:=203;
b:=203;
ix:=53; iy:=353;
jx:=203; jy:=53;
kx:=353; ky:=203;
Form1.Canvas.Rectangle(3,3,400,400);
form1.Canvas.MoveTo(ix,iy);
form1.Canvas.LineTo(a,b);
form1.Canvas.MoveTo(jx,jy);
form1.Canvas.LineTo(a,b);
form1.Canvas.MoveTo(kx,ky);
form1.Canvas.LineTo(a,b);
{рисуем векторы по оси х берем все в половину меньшее(видимость под углом 45 градусов}
ax1:=strtoint(edit1.Text);
by1:=strtoint(edit2.Text);
cz1:=strtoint(edit3.Text);
ax2:=strtoint(edit4.Text);
by2:=strtoint(edit5.Text);
cz2:=strtoint(edit6.Text);
a_x1:=round(a-ax1/2+cz1);
b_y1:=b-by1;
form1.Canvas.MoveTo(a_x1,b_y1);
a_x2:=round(a-ax2/2+cz2);
b_y2:=b-by2;
form1.Canvas.LineTo(a_x2,b_y2);

ax3:=strtoint(edit7.Text);
by3:=strtoint(edit8.Text);
cz3:=strtoint(edit9.Text);
ax4:=strtoint(edit10.Text);
by4:=strtoint(edit11.Text);
cz4:=strtoint(edit12.Text);
a_x3:=round(a-ax3/2+cz3);
b_y3:=b-by3;
form1.Canvas.MoveTo(a_x3,b_y3);
a_x4:=round(a-ax4/2+cz4);
b_y4:=b-by4;
form1.Canvas.LineTo(a_x4,b_y4);

если можно как нибудь усовершенствовать код то напишите как!

Обсуждение

Неизвестный
30.01.2011, 22:22
общий
вот весь код программы


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
cicle:BOOLEAN;
implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:integer;
a,b:integer; //центр координат
ix,iy,jx,jy,kx,ky:integer; {оси}
ax1,ax2,ax3,ax4,by1,by2,by3,by4,cz1,cz2,cz3,cz4:integer;
a_x1,a_x2,a_x3,a_x4,b_y1,b_y2,b_y3,b_y4:integer; //переменные для построения вектора в пространстве
begin
showmessage('введите координаты начала и конца векторов');
a:=203;
b:=203;
ix:=53; iy:=353;
jx:=203; jy:=53;
kx:=353; ky:=203;
Form1.Canvas.Rectangle(3,3,400,400);
form1.Canvas.MoveTo(ix,iy);
form1.Canvas.LineTo(a,b);
form1.Canvas.MoveTo(jx,jy);
form1.Canvas.LineTo(a,b);
form1.Canvas.MoveTo(kx,ky);
form1.Canvas.LineTo(a,b);
{рисуем векторы по оси х берем все в половину меньшее(видимость под углом 45 градусов}
ax1:=strtoint(edit1.Text);
by1:=strtoint(edit2.Text);
cz1:=strtoint(edit3.Text);
ax2:=strtoint(edit4.Text);
by2:=strtoint(edit5.Text);
cz2:=strtoint(edit6.Text);
a_x1:=round(a-ax1/2+cz1);
b_y1:=b-by1;
form1.Canvas.MoveTo(a_x1,b_y1);
a_x2:=round(a-ax2/2+cz2);
b_y2:=b-by2;
form1.Canvas.LineTo(a_x2,b_y2);

ax3:=strtoint(edit7.Text);
by3:=strtoint(edit8.Text);
cz3:=strtoint(edit9.Text);
ax4:=strtoint(edit10.Text);
by4:=strtoint(edit11.Text);
cz4:=strtoint(edit12.Text);
a_x3:=round(a-ax3/2+cz3);
b_y3:=b-by3;
form1.Canvas.MoveTo(a_x3,b_y3);
a_x4:=round(a-ax4/2+cz4);
b_y4:=b-by4;
form1.Canvas.LineTo(a_x4,b_y4);


end;




end.
давно
Мастер-Эксперт
325460
1469
30.01.2011, 22:37
общий
если не сложно выложите проект
я завтра посмотрю, что-нибудь придумаем :)
Об авторе:
to live is to die
давно
Мастер-Эксперт
319965
1463
30.01.2011, 22:42
общий
Что-то Вы все запутали. Совсем неясно, что Вам нужно: определить пересекаются ли векторы или нарисовать их?

P.S. Вектор определен с точностью до параллельного переноса. Поэтому постановка задачи, приведенная Вами, бессмысленна. Можно ставить вопрос о пересечении двух отрезков, но не векторов.
Неизвестный
30.01.2011, 22:44
общий
задача звучит так найти множество пересечений 2х векторов в пространстве.вектора задаются точками начала и конца
Неизвестный
30.01.2011, 23:51
общий
вот исходники
Прикрепленные файлы:
c0e6c0301f4ee1eabe93404c166b112e.rar
давно
Мастер-Эксперт
319965
1463
31.01.2011, 00:21
общий
найти множество пересечений


Если два отрезка совпадают или один лежит внутри другого - это тоже нужно рассматривать?
Неизвестный
31.01.2011, 00:24
общий
да
давно
Мастер-Эксперт
325460
1469
31.01.2011, 14:41
общий
может такой алгоритм попробовать?
(x1, y1, z1) - (x2, y2, z2) и (a1, b1, c1) - (a2, b2, c2)
тогда уравнение первого
x = x1*t + x2*(1 - t)
y = y1*t + y2*(1 - t)
z = z1*t + z2*(1 - t)

аналогично для второго
x = a1*s + a2*(1 - s)
y = b1*s + b2*(1 - s)
z = c1*s + c2*(1 - s)

приравниваем x,y,z, получаем

x1 t + x2 (1 - t) = a1 s + a2 (1 - s)
y1 t + y2 (1 - t) = b1 s + b2 (1 - s)

система из 2 уравнений с 2мя неизвестными, решаем, подставляем s и t во третьи уравнения, убеждаемся, что z-координаты совпали тоже (если нет, то и пересечения нет)

и проверить ежит ли x y z в нужных отрезках.
Об авторе:
to live is to die
давно
Мастер-Эксперт
319965
1463
31.01.2011, 19:19
общий
это ответ
Здравствуйте, Русинов Алексей Игоревич!
Посмотрите вариант в прикрепленном файле.
Прикрепленные файлы:
Неизвестный
31.01.2011, 19:26
общий
Адресаты:
а через какой компилятор вы писали я открываю через делфи вылетает ошибка [Fatal Error] Required package 'TMSUnicodeD7' not found
давно
Мастер-Эксперт
319965
1463
31.01.2011, 19:38
общий
Delphi 7
Дело в том, что у меня установленны TMS пакет, содержащий юникодные компоненты. Вы скопируйте только код в свой проект.
давно
Мастер-Эксперт
319965
1463
31.01.2011, 19:49
общий
Попробуйте сбросить флажок Build with runtime packages в опциях проекта (Project/Options/Packeges)
давно
Мастер-Эксперт
319965
1463
31.01.2011, 20:03
общий
Вот архив с проектом, скомпилированным без пакетов:
Peresechenie_otrezkov.rar (174.7 кб)
Неизвестный
31.01.2011, 20:14
общий
Адресаты:
а вот постороение векторов на графике у меня правильное?
давно
Мастер-Эксперт
319965
1463
31.01.2011, 20:36
общий
Про построение графиков разговора не было, поэтому этот код я не смотрел.
Неизвестный
31.01.2011, 20:43
общий
Адресаты:
ну можете глянуть пожалуста там проэкт этот выкинут про построение графиков
давно
Мастер-Эксперт
319965
1463
01.02.2011, 16:28
общий
Про трехмерное рисование можно почитать здесь:
http://www.delphimaster.ru/articles/mathprogramming.html
давно
Мастер-Эксперт
319965
1463
08.02.2011, 10:38
общий
1)
что значит если он равен 0 или не равен 0

Взгляните на ответ cradlea, нам нужно решить любую из трех систем. Однако, у некоторых из них главный определитель может быть равен нулю (но не у всех). С помощью функции determinant выбирается та, у которой главный определитель не равен нулю и затем эта система решается по формулам Крамера.

2)
зачем нам 3 вектор сделаный из начал 1 и2 отрезка

Для того, чтобы проверить лежат ли отрезки на одной прямой или не лежат. Отрезки лежат на одной прямой тогда, когда три вектора составленные из отрезков и вектора, соединяющего начала этих отрезков, должны быть параллельны. Это делает функция IsOnSameLine (что кстати отражено в комментариях).
давно
Мастер-Эксперт
319965
1463
09.02.2011, 21:24
общий
а зачем в процедуре FindSegIntersection если скалярное произведение 1 и 2 векторов меньше 0 то мы меняет вектор на противоположный и переставляем концы сегмента, и если скалярное произведение 1 и 3 веторов то мы переставляем векторы и сегменты?


Проблема здесь в том, что процедура определения пересечения (в целях удобства) требует чтобы все концы обоих отрезков располагались последовательно в нужном порядке:
1) начало первого отрезка идет первым, а начало второго отрезка - вторым.
2) конец первого отрезка идет после его начала
2) конец второго отрезка идет после его начала
Форма ответа