0

基本的に、平面の方程式を見つけて、点がこの直線の方程式を満たす場合はリストに 1 を配置しようとするコードがいくつかあります。それ以外の場合は、リストに 0 が配置されます。残念ながら、インクリメント量が必要なので、空のスペースがなくても近似平面を作成できるように、方程式に最も近い点をどのように取得しますか?

これまでのコードは次のとおりです。

def plane(self):
    p1 = self.first_pos
    p2 = self.second_pos
    p3 = self.third_pos
    x1,y1,z1 = self.fourth_pos
    x2,y2,z2 = self.fifth_pos
    a = (p2[0] - p1[0],p2[1] - p1[1],p2[2] - p1[2])
    b = (p3[0] - p1[0],p3[1] - p1[1],p3[2] - p1[2])
    abc = ((a[1] * b[2]) - (a[2] * b[1]),(a[2] * b[0]) - (a[0] * b[2]), (a[0] * b[1]) - (a[1] * b[0]))
    constant = (p1[0] *abc[0] * -1) - (p1[1] * abc[1]) - (p1[2] * abc[2])
    lx = []
    lxy = []
    axyz = []
    if x1 > x2 : x1, x2 = x2, x1
    if y1 > y2 : y1, y2 = y2, y1
    if z1 > z2 : z1, z2 = z2, z1
    for z in range(z1, z2+1):
        for y in range(y1,y2+1):
            for x in range(x1,x2+1):
                if int(round(((abc[1] *y) + (abc[2] *z) + constant + 0.6 ) / (-1 * abc[0]))) == x:
                    lx.append(1)
                else:
                    lx.append(0)
                if x == x2:
                    lxy.append(lx)
                    lx = []
            if y == y2:
                axyz.append(lxy)
                lxy = []
    self.first_pos = self.fourth_pos
    self.second_pos = self.fifth_pos
    self.buildMatrix(axyz)
    self.BuildCuboid(axyz)

実際に使用されている線に最も近い点で動作する線を描画するためのコード例を次に示します。

def DrawLine(self):
    self.bot.sendMessage("Drawing line.",ignorable=True)
    fp = self.first_pos
    sp = self.second_pos
    ## This is the vector from pt 1 to pt 2
    x,y,z = sp[0] - fp[0], sp[1] - fp[1], sp[2] - fp[2]

    ## magnitude of that vector
    dist = self.bot.dist3d(fp[0], fp[1], fp[2], sp[0], sp[1], sp[2] )

    ## unit vector
    n_x, n_y, n_z = x/dist, y/dist, z/dist

    ## stepping a dist of 1 in the direction of the unit vector, find the
    ## whole coordinate and place a block at that location
    coords = []
    for d in xrange(0, int(dist)):
        self.blocks.append( (
                       self.block_type,
                       int(round(fp[0] + (n_x * d))),
                       int(round(fp[1] + (n_y * d))),
                       int(round(fp[2] + (n_z * d)))
                       ) )
    self.DrawBlocks()
4

2 に答える 2

0

私があなたの意図を正しく理解している場合、3 つの点 (p0、p1、p2) で定義された平面があり、他の点がその平面内にあるか (またはほぼそう) を評価したいと考えています。

これは、上記のコード スニペットで個々の座標コンポーネントを操作するよりも、行列を使用して最も簡単に表現できます。マトリックスを使用してこの問題と関連する問題を解決する方法を示すリンクは次のとおりです: http://paulbourke.net/geometry/planeeq/

あなたのコードはすでに平面の方程式を表しているように見えます (元の点を代入することで、それがゼロまたはゼロに近いと評価されるかどうかを確認できます)。

次に、候補点を代入して、評価結果がゼロまたはゼロに近いかどうかを確認します。

于 2011-11-05T23:54:31.533 に答える
0

あなたの問題は、 Bresenham's Algorithmによって行われた 2 次元の線プロットの 3 次元バージョンです。BA は、連続した線が得られるようにセルを接続するなど、グリッド内のセルを使用して線をプロットします。つまり、列ごとにインデックスを付けて、同等の x 値の適切なセルを計算する (線が正確に垂直、水平、または 45 度でない場合、ポイント間にスペースが残る) 代わりに、BA はセルからセルに移動し、決定します。プロットされている線形方程式に適合するのに最適な隣接セルはどれか。

これを 3 次元に適応させるには、各線形スライスを x にプロットし、次に各スライスを y にプロットします。実装は OP の演習として残されました。ウィキペディアのページには、n 次元処理のリンクがいくつか含まれています。

于 2011-11-06T08:46:22.257 に答える