2012-03-09 17 views
1

內部我想知道如果在一個平面段的點,其在[0,1] [0,1]相對於段座標。 e.g 0,0左下角,1,1右上角,0.5,0.5中心檢查點是平面段

這些是我已經知道的東西:

- 點是在同一平面的平面段。 - 座標平面段的4個點。但它們不是順時針順序或我知道的任何順序。 - 平面的法線及其與原點的距離。如; ax + by + cz + d。 x,y,z,d是已知的。

這是我做的草圖: plane http://s17.postimage.org/564cjyjy7/plane.png A,B,C點與平面線段在同一平面上。已知P1,P2,P3,P4座標,但不以任何有意義的方式排序。

謝謝。

編輯:

一個想法我有是

  • 排序點

  • 每個點

  • 從2分

  • 點創建矢量之間創建矢量產品他們

  • 如果度爲0到90之間,這裏面

將這項工作?我需要良好的實時性能,不是點產品在CPU上慢? 我將如何找到點的相對座標?

回答

1

在我看來,以檢查這個正在改變整個面和點的座標系的原點的最佳方式:翻譯每一點這樣的左下角點將在座標系的中心,和旋轉都這樣法向矢量將與其中一個軸平行指向。這意味着每個點的矩陣乘法,但在此之後,您可以輕鬆檢查矩形中的哪些點。這是一個XNA C#實現,但邏輯是到處都是一樣的:(我試圖使用你的草圖輸入)

// Inputs - Right handed coordinate system 
Vector3 p1 = new Vector3(-1.0f, 1.0f, 1.0f); // left top 
Vector3 p2 = new Vector3(1.0f, -1.0f, 0.0f); // right bottom 
Vector3 p3 = new Vector3(1.0f, 1.0f, 1.0f); // right top, redundant if this is a rectangle 
Vector3 p4 = new Vector3(-1.0f, -1.0f, 0.0f); // left bottom 

Vector3 a = new Vector3(-0.5f, 0.0f, 0.5f); 

// Calculating transformation matrix 
Vector3 right = Vector3.Normalize(p2 - p4); 
Vector3 forward = Vector3.Normalize(p1 - p4); 
Vector3 up = Vector3.Cross(right, forward); 

Matrix transform = new Matrix(); 
transform.M11 = right.X; 
transform.M12 = right.Y; 
transform.M13 = right.Z; 
transform.M14 = 0.0f; 
transform.M21 = forward.X; 
transform.M22 = forward.Y; 
transform.M23 = forward.Z; 
transform.M24 = 0.0f; 
transform.M31 = up.X; 
transform.M32 = up.Y; 
transform.M33 = up.Z; 
transform.M34 = 0.0f; 
transform.M41 = p4.X; 
transform.M42 = p4.Y; 
transform.M43 = p4.Z; 
transform.M44 = 1.0f; 

transform = Matrix.Invert(transform); 

// Transforming 
Vector3 tp1 = Vector3.Transform(p1, transform); 
Vector3 tp2 = Vector3.Transform(p2, transform); 
Vector3 tp3 = Vector3.Transform(p3, transform); 
Vector3 tp4 = Vector3.Transform(p4, transform); 
Vector3 ta = Vector3.Transform(a, transform); 

ta.X /= tp2.X; // divide with rectangle width 
ta.Y /= tp1.Y; // divide with rectangle height 

// Now everything is on the XY plane 
// P1: {X:0 Y:2.236068 Z:0} 
// P2: {X:2 Y:0  Z:0} 
// P3: {X:2 Y:2.236068 Z:0} 
// P4: {X:0 Y:0  Z:0} 
// A: {X:0.25 Y:0.5  Z:0} 

這適用於任意四個點。

這不是最快的解決方案,但我敢肯定它是最乾淨和最簡單的一種,如果你知道矩陣變換。如果您發現我也有興趣的更快,但簡單的解決方案,但可能不會有性能問題。在我的英特爾2.4GHz處理器上,這種計算在1秒內發生超過100萬次而沒有任何問題。希望這有幫助,祝你好運!

+0

什麼Vector3.Transform辦?我只有矩陣*矢量功能 ,我猜測是不一樣的 – mikbal 2012-03-09 19:42:13

+0

我遇到的一個問題是,飛機段的點不是有序的。所以我不能說這是左上角左右。我有4點是飛機角落。在一個側面節點上,我也有飛機的法線和距離原點。如; ax + by + cz + d。 x,y,z,d是已知的。如果有幫助。 – mikbal 2012-03-09 20:09:46

+0

Vector3變換隻是將矩陣與矢量相乘,因此它們是相同的。 – 2012-03-09 20:10:51

0

我已經找到一種方法來找到我想要的東西。在這裏,它是:(代碼爲C++ /食人魔)

// top or bottom vector of rectangle 
Ogre::Vector3 right = Ogre::Vector3(vertices[3] - vertices[2]); 
right.normalise(); 
    // vector opposite of the top vector 
Ogre::Vector3 left = Ogre::Vector3(vertices[0] - vertices[1]); 
left.normalise(); 


    // you may store above values if rectangle doesnt move much. this would reduce amount of operations 


    // vector from top vertex to position we are checking 
Ogre::Vector3 p2ToPos = Ogre::Vector3(pos - vertices[2]); 
p2ToPos.normalise(); 

    // vector from bot vertex to position we are checking 
Ogre::Vector3 p1ToPos = Ogre::Vector3(pos - vertices[1]); 
p1ToPos.normalise(); 

    // angle between our vectors 
Ogre::Real dot1 = p2ToPos.dotProduct(right); 
Ogre::Real dot2 = p1ToPos.dotProduct(left); 

    // is both dot products (which gives cos) are positive point is between our rectangle 
if(dot1 > 0 && dot2 > 0) 
    return true; 

這算什麼,我們希望只有2正常化的功能和2分的產品。

+0

是的,但你說你也需要相對座標...在我看來,問這個更復雜的問題並不公平,因爲你有一個更簡單的問題的解決方案... – 2012-03-11 08:36:59

+0

你是一個更慢,但一個完整的答案。無論如何,我已決定使用物理光線投射。它快得多並且適用於每個網格。至少我學到了一些數學:) – mikbal 2012-03-11 18:05:23