Притежание на Face point
Трябва да направите проверка за сблъсък в обемното пространство. Лицето (равнината) се определя от 4 точки. Как да определим дали една точка принадлежи на това лице?
Съвет #1: Равнината се определя оттриточки (първата аксиома на стереометрията).
И какво? Разклонение за плоски многоъгълници, освен това едва ли има решение там.
Това вероятно е вярно, но ако знаех това, ако знаех векторите, тогава лесно щях да се справя с въпроса сам.
Ако нямаше алгоритъм за решение, нямаше да ви дам линк. Цитирам:Виктор (04/17/04 17:47) [4] Триангулирайте вашия многоъгълник (разбийте го на триъгълници) и след това проверете дали точката принадлежи на всеки триъгълник.
Вашият случай като цяло е прост.
Съвет #2 (известен още като отговор на въпроса): От вашите четири точки вземете три, които са на една и съща линия (все пак силно препоръчвам да запазите само три точки). Нека техните координати са съответно: (x0, y0, z0) (x1, y1, z1) (x2, y2, z2) и координатите на проверяваната точка - (x, y, z). След това просто трябва да изчислите детерминантата: x-x0 y-y0 z-z0 x1-x0 y1-y0 z1-z 0 x2-x0 y2-y0 z2-z0 Ако е равно на нула, тогава точката лежи на равнината.
Ако не знаете какво е "детерминант" и как да го изчислите, тогава има много информация по тази тема в Интернет или може би те ще помогнат във форума. Късмет!
Сега това е работата. Аз ще!
Очевидно по-правилно - да се изчисли разстоянието от равнината до точката. В определен район на нулата - помислете за всичко.
Но бих изяснил въпроса. Говорим за сблъсък с лице - а лицето е част от равнината (лицето на куб, пирамида). И за какво говорим? За попадение на точка на лице или на лицева равнина? Иначе появата точно на 4 точки ми е непонятна.
Да точно разстоянието, т.ккато разглеждайки дадената детерминанта, ние просто намираме обема на определен паралелипипед. И можете да дадете пример (близко разположени базови точки) - обемът ще бъде много малък (условно 0), но въпреки това четвъртата точка ще бъде далеч от равнината.
> И можете да дадете пример (близко разположени базови точки) - обемът ще бъде много малък (условно 0). точката ще бъде далеч от самолета
Първо, не можете. Запомнете, черавнинатае безкрайна. За по-добро разбиране тази детерминанта е по-добре да се интерпретира не като 1/6 от обема на паралелепипеда, а като уравнение на равнината (ако приемем (x, y, z) като текуща точка). Така че просто заместваме координатите на точката, която се проверява, в това уравнение и виждаме дали точката удовлетворява това уравнение или не, ако го прави, тогава точката лежи в равнината.
Започвам обаче да подозирам, че четири точки са въведени именно за обозначаване на лице. Просто видях заглавието на темата. След това решението на проблема се разделя на два етапа: 1. Проверка дали дадена точка принадлежи на лицевата равнина (виж [5]) 2. Проверка в "локалните" координати на равнината, че дадена точка принадлежи на четириъгълник, както в конвенционална двумерна координатна система (вижте съседния клон "Алгоритъм за попадение на точка ", една от публикациите описва подробно как да направите това, особено след като случаят е опростен - четириъгълникът винаги е изпъкнал).
Извинявам се за грешката - смесеното произведение е равно на пълния обем на паралелепипеда, а не на 1/6, както беше написано.
Плюс допълнение: в клон "Алгоритъм за постигане на точка" пост [12]
>Но бих изяснил въпроса. Говорим за сблъсък с лице - а лицето е част от равнината (лицето на куб, пирамида). И за какво говорим? За попадение на точка на лице или на лицева равнина? Иначе не разбирам появата, а именно 4 точки.
Наистина имам нужда от ръбов сблъсък.
>2. Проверка в "локалните" координати на равнината дали дадена точка принадлежи на четириъгълник, както в конвенционална двумерна координатна система (вижте съседния клон "Алгоритъм за уцелване на точка. ", един от постовете описва подробно как се прави това, особено след като случаят е опростен - четириъгълникът винаги е изпъкнал).
Как да конвертирате в "местни координати"?
> особено след като случаят е опростен - четириъгълникът винаги е изпъкнал.В този клон ли е? или как?
Но точка 2 може да се направи така: Необходимо е четириъгълникът да се раздели на 2 триъгълника, напълно разположени в четириъгълника (в случай, че последният не е изпъкнал). След това гледайте сблъсъци с тези триъгълници. За нас във връзка с 1-ви е достатъчно да проверим къде ще попадне проекцията. За да направите това, можете да направите по различни начини: 1. Както е описано по-горе. 2. Начертайте страните на равнината и вижте в кои полуравнини ще попадне точката - тук трябва да се справите много внимателно със знаците. 3. От нашата точка начертайте сегменти до върховете - получавате пирамида, изчислете площта на лицата. Ако площта на основата "не се различава много" от сумата на площите на страничните лица, тогава всичко е пакет. Между другото, този метод може да се използва без изчисляване на разстоянието.
По-късно ще пиша какво става.
Прав си, проверката с уравнението от [5] може да не е правилна, ако площта на триъгълника е твърде малка или ако върховете са близо до това да лежат на права линия. Наистина е по-добре да се оцени отклонението на точка от равнина:
За да определите разстоянието, първо трябва да определите уравнението на равнината: Ax + By + Cz + D = 0
Както вече споменахме, запишете детерминантата от [5], групирайте по отношение на x, y и z, като ги считате за променливи и вземете A, B, C и D. Тогава разстоянието от точкатакъм равнината може да се изчисли по формулата: Ax + By + Cz + D h = -------------------- (вземете тази стойност по модул) sqrt(A^2 + B^2 + C^2) Внимание, тук x, y, z вече не са променливи, а координатите на вашата отметната точка.
И за сметка на проверката на членството наfaces, когато се установи собствеността на самолета, тогава методите, описани в следващия клон и в статията за algolist "e, работят доста добре. В този случай е много лесно да отидете на "локални" координати - изхвърлете z координатата. За тези два метода това е напълно достатъчно. Само не забравяйте да разделите ръба на триъгълници - много разумна идея.
P.S. Извинявам се за грешката в пост [9]: четириъгълник може да не е изпъкнал.
функция PointInsidePolygon(Intersection: TVector; Polygon: масив от TVector; VertexCount: Integer): Boolean; var i: Integer; Ъгъл: единичен; vA, vB: TVector; начален ъгъл := 0;
for i := 0 to VertexCount - 1 do begin vA := VectorSubtract(Polygon[i], Intersection); vB := VectorSubtract(Polygon[(i + 1) mod VertexCount], Intersection);
Ъгъл := Ъгъл + Ъгъл МеждуВектори(vA, vB);
if Angle >= PI * 2 - 0.1 then begin Result := True; Изход; край;
> Yar-Com (22.04.04 09:21) [18]Вярно за изпъкнали многоъгълници. По принцип това не е вярно за неизпъкналите. При изпъкналите принципът е същият като моя с площите, но е по-опростен. Ъгъл - абсолютна стойност ли имате предвид?
Резултат := (Ъгъл >= PI * 2 - 0,1)
да, да, така е наистина по-добре ) за сметка на изпъкналостта, мисля, че това не е проблем, който трябва да се триангулира.
функция AngleBetweenVectors(Vector1, Vector2: TVector): Single; begin Result := ArcCos(VectorDotProduct(VectorNormalize(Vector1),VectorNormalize(Вектор2))); ако IsNan(Резултат) тогава Резултат := 0; край;
това наистина е доста бавно, но ако използвате bboxes и първо ги проверите за сблъсък и едва след това намерете по-точна точка на сблъсък.