2016-11-07 19 views
0

私はPythonを使って2次元でlookAt関数を作成しようとしているので、今ここに私のコードがあります。2次元でLookAtのような関数を計算する

from math import * 

def lookAt(segment, originPoint): 
    segmentCenterPoint = getSegmentCenter(segment) 
    for i in range(2): 
     vtx = getVertex(segment, i) 
     x, y = getVertexCoord(vtx) 
     # Calculate the rotation angle already applied on the polygon 
     offsetAngle = atan2(y - segmentCenterPoint.y, x - segmentCenterPoint.x) 
     # Calculate the rotation angle to orient the polygon to an origin point 
     orientAngle = atan2(segmentCenterPoint.y - originPoint.y, segmentCenterPoint.x - originPoint.x) 
     # Get the final angle 
     finalAngle = orientAngle - (pi/2) 
     if offsetAngle >= pi: 
      offsetAngle -= pi 
     elif offsetAngle < 0: 
      offsetAngle += pi 
     finalAngle += offsetAngle 
     # Temporary move the point to have its rotation pivot to (0,0) 
     tempX = x - segmentCenterPoint.x 
     tempY = y - segmentCenterPoint.y 
     # Calculate coords of the point with the rotation applied 
     s = sin(finalAngle) 
     c = cos(finalAngle) 
     newX = tempX * c - tempY * s 
     newY = tempX * s + tempY * c 
     # Move the point to the initial pivot 
     x = newX + segmentCenterPoint.x 
     y = newY + segmentCenterPoint.y 
     # Apply new coords to the vertex 
     setVertexCoord(vtx, x, y) 

I手動でいくつかの例を試し、よく働いたが、私は、セグメントの数千に関数を適用しようとしたとき、いくつかのセグメントが十分に配向していないと思われます。

私はおそらく何かを逃したが、私はそれが何であるか分からない。また、それを高速に計算する方法がありますか?

ありがとうございました。ここで

EDIT

は、よりよいルックアットの目標を理解するための視覚化したものです。 目標は、A、B座標を見つけることです。すでにO、A、Bを知っていると仮定します。 ([AB]は、我々は点Oに垂直に配向させることが必要セグメントである)

visualization of lookAt

+0

お得ですか?これらの操作の目標を記述できますか? offsetAngleを使った計算は奇妙に見えます。 – MBo

+0

私は何を見つける必要があるかを理解するために写真を追加しました。コメントありがとうございました。 – mickaelb91

+0

はい、すべては現在明らかです。 – MBo

答えて

0

Aの位置「とB」を見つけるには、回転ポイントを必要とする(とでは、すべての角度に対処していません)。

Find vector OC = segmentCenterPoint - originPoint 
Make normalized (unit) vector oc = OC/Length(OC) 
Make perpendicular vector P = (-oc.Y, oc.X) 
Find CB length lCB 
Find A' = C + lCB * P 
     B' = C - lCB * P 
+0

ありがとう、それは働いていますが、Y座標が垂線ベクトルのX 1の前にあるのはなぜですか? – mickaelb91

+1

これは、pi/2回転行列による乗算の結果です - newx、newyの計算と同様です – MBo

関連する問題