Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Вниз

Треугольник АВС и точка P. Кто помнит геометрию?   Найти похожие ветки 

 
Aleksey_a   (2004-09-28 03:32) [0]

Простая вроде задача но никак не могу вспомнить. Дано три точки на плоскости A(Aх,Aх), B(Bx,By) и C(Cx,Cy) (треугольник). Нужно решить задачу попадания или непопадания точки P(Px,Py) в этот треугольник.


 
Darth   (2004-09-28 04:18) [1]

точка должна лежать справа от AB, BC и CD.


 
Aleksey_a   (2004-09-28 05:46) [2]

А можно попонятней? Что такое справа и как это выглядит в формуле?


 
ЮЮ ©   (2004-09-28 06:18) [3]

Z-координата векторных произведений ABхAP, BCxBP и CAxCP должны быть (положитедьны/отрицательны - не помню, поищи теорию)


 
Булат Шакиров   (2004-09-28 06:36) [4]

http://algolist.manual.ru/maths/geom/belong/poly2d.php


 
MBo ©   (2004-09-28 07:55) [5]

все скалярные произведения нормалей сторон на векторы точка-соотв. вершина должны быть положительны (при нумерации вершин против час. стрелки)


 
Sodom   (2004-09-28 09:33) [6]

А если подойти к этому проще. Нарисуй треугольник, точку, закрась его и посмотри совпадает ли цвет точки с цветов заливки. :)


 
Леван   (2004-09-28 10:11) [7]

Пусть Fab(m)=0 - уравнение прямой, проходящей через точек "a","b":

(x-xa)/(xb-xa)-(y-ya)/(yb-ya)=0

условие, что точка "с" и точка "p" лежат по одной стороне линии ab, заключается в
Fab(c)*Fab(p)>0
т.е. если

Fab(c)*Fab(p)>0
Fbc(a)*Fbc(p)>0
Fac(b)*Fac(p)>0
то точка p лежит внутри треугольника abc


 
Денис К.   (2004-09-28 10:56) [8]

Как я понял речь идет про плоскость, а не про пространство.
Тогда, если знаешь что такое векторное произведение, то
M = AB x AP
N = BC x BP
Q = CA x CP
Знаки M.z, N.z, Q.z должны быть одинаковыми (либо "+" либо "-"),
а если какая-то из координат *.z = 0 то точка лежит на стороне или ее продолжении.


 
alexsh   (2004-09-30 20:49) [9]

Если сумма площадей треугольников PAC, PAB, PBC равна площади треугольника ABC, то точка лежит внутри треугольника


 
Darth   (2004-09-30 22:58) [10]

alexsh или на одной из его граней. Или является одной из его вершин.


 
EViruS   (2004-10-01 05:51) [11]

Есть много вариантов. Вот простейшие:
1) школьная геометрия
2) составить ур-я прммых и поглядеть как расположена точка относительно их
3) пройтись по всем вершинам (против ЧС) и проверить как располоден отрезок из вершины до точки и до след вершины, если он всегда правый, то следовательно точка в треугольнике
В общем, algolist.manual.ru

Стоит почитать про выпуклые оболочки или расположение точек относительно прямой.


 
alexshx   (2004-10-04 18:14) [12]

Darth, я с тобой не согласен. Если точка лежит на одной из сторон треугольника, то одна из площадей треугольников PAC, PAB, PBC будет равна 0, а сумма площадей двух остальных и будет равна площади треугольника ABC. В случае, если заданная точка P - одна из вершин, то две из площадей PAC, PAB, PBC будут равны 0, а площадь оставшегося треугольника будет равна площади треугольника ABC.


 
oldman ©   (2004-10-04 18:19) [13]

:)))
находишь точку пересечения высот (медиан, биссектрис)
строишь отрезок из этой точки в искомую
ищешь точки пересечения со сторонами треугольника
если точки есть - искомая точка вне треугольника
если нет - внутри
:)))


 
oldman ©   (2004-10-04 18:20) [14]

поправочка - если тоска пересечения совпадает с искомой - точка лежит на стороне


 
Fenik   (2004-10-08 00:03) [15]

http://delphibase.endimus.ru/?action=viewfunc&topic=mathcalc&id=10560


 
XProger ©   (2004-10-08 01:42) [16]


//Положение точки p относительно прямой (p1, p2)
function Side(p, p1, p2: TPoint): boolean;
var
a, b: TPoint;
begin
a.X := p2.X - p1.X;
a.Y := p2.Y - p1.Y;
b.X := p.X - p1.X;
b.Y := p.Y - p1.Y;
Result := (a.X * b.Y - a.Y * b.X) >= 0;
end;

cur := Point(X, Y);
if Side(cur, p[1], p[2]) and
  Side(cur, p[2], p[3]) and
  Side(cur, p[3], p[1]) then
Caption := "В яблочко!!!"   //соответственно =)
else
Caption := "Неа!";          //Не попал =)


 
Megabyte-ceercop ©   (2004-10-08 07:04) [17]

Самые быстрые формулы в виде условий без вызора доп функций.

Есть прямоугольник ABCD и точка P

if ((B.x -A.x)*(P.y-A.y)>(P.x - A.x)*(B.y-A.y)) &
((C.x -B.x)*(P.y-B.y)>(P.x - B.x)*(C.y-B.y)) &
((D.x -C.x)*(P.y-C.y)>(P.x - C.x)*(D.y-C.y)) &
((A.x -D.x)*(P.y-D.y)>(P.x - D.x)*(A.y-D.y)) then Внутри_или_наоборот_ли._Еще_не_выяснил.

Для треугольника ABC :

if ((B.x -A.x)*(P.y-A.y)>(P.x - A.x)*(B.y-A.y)) &
((C.x -B.x)*(P.y-B.y)>(P.x - B.x)*(C.y-B.y)) &
((A.x -C.x)*(P.y-C.y)>(P.x - C.x)*(A.y-C.y)) then

формулы пока не тестил.
Вывел их для работы над своими нелинейными тайлами.
Пробуйте.


 
Megabyte-ceercop ©   (2004-10-08 11:49) [18]

Проверено. Формулы которые я тут выложил пунктом выше. Работают безошибочно. и возвращают True если точка внутри прямоугольника (или треугольника во втором случае).


 
Fenik   (2004-10-08 18:12) [19]

Если заранее не известен порядок следования вершин, можно воспользоваться тем же свойством скалярного произведения. Вот универсальная функция:

function PtInTriang(const P, A, B, C: TPoint): Boolean;
 function _PIT(const C1, C2, C3: TPoint): Boolean;
 begin
   Result := False;
   if (P.x-C1.x)*(C1.y-C2.y) - (P.y-C1.y)*(C1.x-C2.x) >= 0 then
   if (P.x-C2.x)*(C2.y-C3.y) - (P.y-C2.y)*(C2.x-C3.x) >= 0 then
   if (P.x-C3.x)*(C3.y-C1.y) - (P.y-C3.y)*(C3.x-C1.x) >= 0 then
     Result := True;
 end;
begin
 if (A.x-B.x)*(C.y-B.y) > (A.y-B.y)*(C.x-B.x)
   then Result := _PIT(A, C, B)
   else Result := _PIT(A, B, C);
end;


> Megabyte-ceercop ©  (08.10.04 11:49) [18]

Ну уж, с прямоугольником можно и попроще :-)
Ты наверное имел в виду выпуклый четырехугольник?


 
Megabyte-ceercop ©   (2004-10-11 06:19) [20]


> Ну уж, с прямоугольником можно и попроще :-)

Поделись эсли так. Мне очень нужно...  Хотя куда уж проще то?


 
wiz ©   (2004-10-11 07:30) [21]

2 Megabyte-ceercop [20]:

Если у тебя действительно прямоугольник (стороны попарно параллельны и попарно перпендикулярны), то можно одним афинным преобразованием перейти в систему координат, где стороны прямоугольника направлены вдоль координатных осей. Тогда всё сводится к покоординатным проверкам больше/меньше...

алгоритм будет выглядеть примерно так:
1. на этапе построения прямоугольника строим матрицу перехода в локальную систему координат (вообще говоря, её можно построить таким образом, что в лок. координатах прямоугольник будет иметь точки (0,0); (0,1); (1,1); (1,0);)

2. "проверка точки P". домножаем вектор P на матрицу перехода (для двумерного случая - 6 умножений и 4 сложения) и делаем проверку: if (p_x_new>0) and (p_x_new<1) and (p_y_new>0) and (p_y_new<1) then "внутри"

(Алгоритм можно обобщить и на случай параллелограмов, но _не_ произвольных выпуклых четырехугольников)

Если интересно, могу написать как этот алгоритм реализовать.


 
Megabyte-ceercop ©   (2004-10-11 07:53) [22]


> wiz ©   (11.10.04 07:30) [21]

Мне нужны выпуклые, случайные многоугольники, и думаю нет формуулы проще и быстрее той, которая у меня уже есть.
Конечно для паралеллограммов можно упростить, но это не то.


 
Думкин ©   (2004-10-11 08:02) [23]

> [21] wiz ©   (11.10.04 07:30)

Аффинным преобразованием такого же можно добиться и для произвольного параллелограмма. Если же жестко для прямоугольника - то это подгруппа движений.
Обобщать не надо - те же самые афинные преобразования. А как - ну тот же Александров(Аналитическая геометрия).


 
wiz ©   (2004-10-11 22:56) [24]

2 Думкин:

угу... что-то я с утреца пораньше был чуток глупый :)
с другой стороны, это всё равно не то, что нужно человеку :)))


 
Megabyte-ceercop ©   (2004-10-12 06:02) [25]

Ой. Я понял почему все запутались.
Я под словом прямоугольник - подразумеваю просто четырехугольник. :)
Я не отношусь серьезно к разным там названиям. :)
Думал и так будет ясно что я имел в виду :-|


 
Думкин ©   (2004-10-12 06:39) [26]

>  [25] Megabyte-ceercop ©   (12.10.04 06:02)
> Я не отношусь серьезно к разным там названиям. :)

:)
У нас это лечили на первом курсе у подобных вам. Лечили просто - на матане в первой сессии малейшая оговорка по существу - банан. Народ проникся. %)
А в математике иначе трудно(да и не только в ней). Терминология - тоже важно. Как ни глупо, но ряд войн на этом форуме возникают только по причине различий в терминологии.


 
Megabyte-ceercop ©   (2004-10-12 08:16) [27]


> У нас это лечили на первом курсе у подобных вам.

Потому то подобные нам и нелюбят учиться. :))


 
wiz ©   (2004-10-12 09:09) [28]

2 Думкин: (извините за оффтоп) позвольте поинтересоваться: вы случаем не ММФ НГУ имеете ввиду? :)))


 
Думкин ©   (2004-10-12 09:19) [29]

> [28] wiz ©   (12.10.04 09:09)

его родимый.


 
wiz ©   (2004-10-12 11:06) [30]

2 Думкин: (извините за оффтоп) А я сбежал после второго курса... на ФФ



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.04 c
14-1104912807
syte_ser78
2005-01-05 11:13
2005.01.23
получение части стринговой переменной?


14-1103697842
syte_ser78
2004-12-22 09:44
2005.01.23
Обращение к Харьковчанам.


1-1105089078
Dr. Genius
2005-01-07 12:11
2005.01.23
Контекстное меню папок


14-1104182866
Johnmen
2004-12-28 00:27
2005.01.23
Дефилеры напускают оранжевый туман...


14-1104701909
Hmmm
2005-01-03 00:38
2005.01.23
Как мне вычислить x?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский