簡體   English   中英

垂直化三角形

[英]Verticalize Triangle

我有一個三角形,其中兩個點具有相同的Z值而一個點具有不同的值。 現在,我想用不同的Z值變換該點,以便它光學地生成一個“垂直”三角形。 假設點C是具有不同高度值的點,我不知何故需要移動點C的X和Y坐標,使其正交於A和B的差矢量,直到它們垂直對齊,例如,坡度正好是90度。 但是不幸的是,我是一個關於輪換和東西的白痴。 您能給我一些解決方法的提示嗎?

我需要的代碼是用C ++編寫的,但是簡單的偽代碼就可以了:)

但最好是一種相當快速的方法,因為每位玩家每次塊加載最多必須調用700000次

假設您有ABC點,Az == Bz,z代表垂直方向。

首先,將C的x,y坐標投影到2D中A和B之間的線上:

// find normalized AB vector:
AB.x = B.x - A.x;
AB.y = B.y - A.y;
length = sqrt(AB.x * AB.x + AB.y * AB.y);
// test for length == 0 to avoid div by zero
AB.x /= length;
AB.y /= length; // note: you could save a division by dividing dot by length instead

// project C onto AB:
AC.x = C.x - A.x;
AC.y = C.y - A.y;
// this gives us how far along the line AB the projected point is:
dot = (AC.x * AB.x) * (AC.y * AB.y);
newC.x = A.x + (AB.x * dot);
newC.y = A.y + (AB.y * dot);
newC.z = A.z; // same as B.z

接下來,如果使用AB作為鉸鏈將三角形旋轉到垂直位置,則找到投影點和C之間的3D距離,該距離將是新點的AB線上方的垂直高度:

newCC.x = C.x - newC.x;
newCC.y = C.y - newC.y;
newCC.z = C.z - newC.z;
height = sqrt((newCC.x * newCC.x) + (newCC.y * newCC.y) + (newCC.z * newCC.z));

設置z值:

newC.z += height;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM