Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 0
Регистрация: 12.05.2011
Сообщений: 36

Проверка пренадлежности точки треугольнику заданному координатами вершин

15.05.2011, 16:53. Показов 1516. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помощи, нашел готовую программу, но немогу разобраться в алгоритме проверки пренадлежности точки (0;0) треугольнику заданному координатами вершин. Вот код всей процедуры, в которой производиться также рсование нужных элементов. Ближе к концу помечено коментарием начало самого алгоритма проверки, вот в нем мне и нужно разобраться
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
procedure TForm1.Button1Click(Sender: TObject);
var
 x1,y1,x2,y2,x3,y3,minx,miny,maxx,maxy,mx,my,fi,dfi:real;
begin
 if (edit1.Text='')or (edit2.Text='') or (edit3.Text='')or (edit4.Text='')or
 (edit5.Text='')or (edit6.Text='')then
 begin
  showmessage('Поля ввода координат пусты');
  exit;
 end;
 x1:=strtofloat(edit1.Text);
 x2:=strtofloat(edit3.Text);
 x3:=strtofloat(edit5.Text);
 y1:=strtofloat(edit2.Text);
 y2:=strtofloat(edit4.Text);
 y3:=strtofloat(edit6.Text);
 
 if x1<x2 then
  minx:=x1
 else
  minx:=x2;
 if minx>x3 then
  minx:=x3;
 if y1<y2 then
  miny:=y1
 else
  miny:=y2;
 if miny>y3 then
  miny:=y3;
 if x1>x2 then
  maxx:=x1
 else
  maxx:=x2;
 if maxx<x3 then
  maxx:=x3;
 if y1>y2 then
  maxy:=y1
 else
  maxy:=y2;
 if maxy<y3 then
  maxy:=y3;
 
 if maxx*minx<0 then
  mx:=(image1.width-20)/(maxx-minx)
 else
  if maxx>0 then
   mx:=(image1.width-20)/(abs(maxx))
  else
   if maxx<0 then
    mx:=(image1.width-20)/(abs(minx))
   else
    mx:=(image1.width-20)/10;
 if maxy*miny<0 then
  my:=(image1.height-20)/(maxy-miny)
 else
  if maxy>0 then
   my:=(image1.height-20)/(abs(maxy))
  else
   if maxy<0 then
    my:=(image1.height-20)/(abs(miny))
   else
    my:=(image1.height-20)/10;
 
 
 Image1.Canvas.Brush.Color:=clSilver;
 image1.Canvas.FillRect(rect(0,0,image1.Width,image1.Height));
 image1.Canvas.Pen.Color:=clBlack;
 image1.Canvas.Pen.Width:=1;
 if miny<0 then  //Рисуем ось Ох
 begin
  image1.Canvas.MoveTo(0,image1.Height-abs(trunc(miny*my)));
  image1.Canvas.LineTo(image1.Width-10,image1.Height-abs(trunc(miny*my)));
 end
 else
 begin
  image1.Canvas.MoveTo(0,image1.Height-10);
  image1.Canvas.LineTo(image1.Width-10,image1.Height-10);
 end;
 if minx<0 then  //Рисуем ось Оу
 begin
  image1.Canvas.MoveTo(abs(trunc(minx*mx)),0);
  image1.Canvas.LineTo(abs(trunc(minx*mx)),image1.Width-10);
 end
 else
 begin
  image1.Canvas.MoveTo(10,10);
  image1.Canvas.LineTo(10,image1.Width-10);
 end;
 
 image1.Canvas.Pen.Color:=clRed;
 image1.Canvas.Pen.Width:=2;
//Рисуем треугольник
 if (minx<0) and (miny<0) then
 begin
  image1.Canvas.MoveTo(trunc((-minx+x1)*mx),image1.Height-(trunc((-miny+y1)*my)));
  image1.Canvas.LineTo(trunc((-minx+x2)*mx),image1.Height-(trunc((-miny+y2)*my)));
  image1.Canvas.LineTo(trunc((-minx+x3)*mx),image1.Height-(trunc((-miny+y3)*my)));
  image1.Canvas.LineTo(trunc((-minx+x1)*mx),image1.Height-(trunc((-miny+y1)*my)));
 end
 else
  if (minx<0) and (miny>=0) then
  begin
   image1.Canvas.MoveTo(trunc((-minx+x1)*mx),image1.Height-(trunc(y1*my)+10));
   image1.Canvas.LineTo(trunc((-minx+x2)*mx),image1.Height-(trunc(y2*my)+10));
   image1.Canvas.LineTo(trunc((-minx+x3)*mx),image1.Height-(trunc(y3*my)+10));
   image1.Canvas.LineTo(trunc((-minx+x1)*mx),image1.Height-(trunc(y1*my)+10));
  end
  else
   if (minx>=0) and (miny<0) then
   begin
    image1.Canvas.MoveTo(trunc(x1*mx)+10,image1.Height-(trunc((-miny+y1)*my)));
    image1.Canvas.LineTo(trunc(x2*mx)+10,image1.Height-(trunc((-miny+y2)*my)));
    image1.Canvas.LineTo(trunc(x3*mx)+10,image1.Height-(trunc((-miny+y3)*my)));
    image1.Canvas.LineTo(trunc(x1*mx)+10,image1.Height-(trunc((-miny+y1)*my)));
   end
   else
   begin
    image1.Canvas.MoveTo(trunc(x1*mx)+10,image1.Height-(trunc(y1*my)+10));
    image1.Canvas.LineTo(trunc(x2*mx)+10,image1.Height-(trunc(y2*my)+10));
    image1.Canvas.LineTo(trunc(x3*mx)+10,image1.Height-(trunc(y3*my)+10));
    image1.Canvas.LineTo(trunc(x1*mx)+10,image1.Height-(trunc(y1*my)+10));
   end;
  //Проверяем принадлежит ли начало координат треугольнику
 fi:=arctan2(y1,x1)-arctan2(y3,x3);
 if abs(fi)>(Pi-0.0001) then
  fi:=fi-2*Pi*abs(fi)/fi;
 dfi:=arctan2(y2,x2)-arctan2(y1,x1);
 if abs(dfi)>(Pi-0.0001) then
  dfi:=dfi-2*Pi*abs(dfi)/dfi;
 fi:=fi+dfi;
 dfi:=arctan2(y3,x3)-arctan2(y2,x2);
 if abs(dfi)>(Pi-0.0001) then
  dfi:=dfi-2*Pi*abs(dfi)/dfi;
 fi:=fi+dfi;
 if (abs(fi)>(2*Pi-0.0001)) or ((x1=0) and (y1=0)or(x2=0)and (y2=0)or(x3=0) and (y3=0))
     or ((x1=0) and (x2=0) and (y1*y2<0))or ((x1=0) and (x3=0)and(y1*y3<0))or ((x2=0) and (x3=0)and (y2*y3<0))
     or ((y1=0) and (y2=0)and (x1*x2<0))or ((y1=0) and (y3=0)and (x1*x3<0))or ((y2=0) and (y3=0)and (x2*x3<0))then
  showMessage('Начало координат принадлежит области треугольника')
 else
  showMessage('Начало координат не принадлежит области треугольника');
 image1.Canvas.FillRect(rect(0,0,image1.Width,image1.Height));
 edit1.SetFocus;
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2011, 16:53
Ответы с готовыми решениями:

Определить принадлежность точки с координатами (x, y) к треугольнику с заданными вершинами
Определить принадлежность точки с координатами (x,y) к треугольнику с заданными вершинами (-a;-a);(2a;a);(0;a);

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;math.h&gt; #include &lt;algorithm&gt; using...

Определение пренадлежности точки
Помогите написать прогу, которая определяет попадает ли точка с заданными координатами в треугольник с заданными вершинами

1
4053 / 2664 / 583
Регистрация: 11.09.2009
Сообщений: 9,512
16.05.2011, 02:58
Цитата Сообщение от mpd Посмотреть сообщение
в нем мне и нужно разобраться
Обычная тригонометрия. Принадлежность точки заданной области на плоскости. Если и с этим туго - тут рядом есть форум "Математика".

Конструкции вида
Delphi
1
if abs(dfi)>(Pi-0.0001) then
это из-за конечной точности счёта процессором. Сравнение чисел с плавающей точкой (особенно на равенство) всегда надо выполнять с заданной точностью. В данном случае - если абсолютное отклонение не больше 0.0001.
Кстати, выполнено это в данном коде не совсем корректно, а местами и вовсе не выполнено (потенциальный источник ошибки):
Delphi
1
2
3
...
or ((x1=0) and (x2=0) and (y1*y2<0))or ((x1=0) and (x3=0)and(y1*y3<0))or ((x2=0)
...
хотя это тоже значения с плавающей точкой.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2011, 02:58
Помогаю со студенческими работами здесь

Если точки могут быть координатами вершин треугольника, вычислить его площадь
Даны координаты трех точек на плоскости. Если они могут быть координатами вершин равностороннего треугольника, вычислить его площадь.

Найти расстояние от данной точки до ближайшей стороны треугольника, заданного координатами вершин
Даны координаты вершин треугольника и координаты некоторой точки внутри него. Найти расстояние от данной точки до ближайшей стороны...

Проверка пренадлежности IP адреса
Как красиво написать проверку, что IP принадлежит одному из трех интервалов) ? 10.0.0.0 — 10.255.255.255 172.16.0.0 — 172.31.255.255 ...

Проверить принадлежность точки с заданными координатами заданному сегменту окружности
Окружность на плоскости задана тремя лежащими на ней точками A, B, C. Фигура S представляет собой сегмент, ограниченный этой окружностью и...

Треугольник задан координатами своих вершин. Проверка существования. Вычисление периметра, площади, длин медиан
Помогите составить програму в паскале срочно!!!Ко вторнику, пожалуйста. Треугольник задан координатами своих вершин в двумерной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Вот уже год прошел, как у меня домен в reg.ru ...
Etyuhibosecyu 16.04.2026
И ничего они мне не сделали. Если отвязать карту, никакие услуги они не навяжут. Я бы с радостью продлил еще на два года, чтобы не мучиться с временным доменом и меня уже знали по red-star-soft. com,. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru