2011-11-05 44 views
0

基本上我有一些代码,它会找到一个平面的方程,然后尝试在列表中放置一个1,如果一个点满足这个方程的一条线,否则将0放入列表中。 不幸的是,必须有一个增量量,那么如何得到一个最接近方程的点,以便可以在没有一堆空白空间的情况下制作一个近似平面?如何拟合方程的最近点? Python

这里是到目前为止的代码:

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() 
+0

它不是很清楚这是一个编程问题还是一个数学问题 - 不管这里有很多代码,但没有很多上下文。我不确定没有更多信息我们可以帮助你。 – jedwards

+0

问题是,怎样才能使得结果列表的表面尽可能接近实际平面,因为现在,如果平面不是水平的,垂直的或两个轴之间的关系是1, t是一个表面,而是1之间的散点图,0之间的散点图。 – joseph

回答

0

您的问题是由Bresenham's Algorithm完成的二维线绘图的三维版本。 B-A使用网格中的单元格绘制一条线,包括连接单元以便获得连续线。也就是说,不是逐列索引,而是计算等价x值的适当单元格(如果线条不完全垂直,水平或45度,会在点之间留出空间),BA将逐个单元格移动,从而确定哪个相邻单元最适合拟绘制的线性方程。

通过将每个线性切片绘制在x中,然后再对y中的每个切片绘制,可以将其调整为3维。执行工作作为OP的一项练习。维基百科页面包含一些用于n维治疗的链接。

+0

谢谢澄清是OP实际想要的。该守则表明努力确定一个点与三点定义的平面的接近度。总体目标不明确。 –

+0

我还在猜测。可能应该在我的回答前面加上一个大“我想”**。 – PaulMcG

0

如果我为了正确理解你的意图,你有一个由三个点(p0,p1,p2)定义的平面,然后要评估其他点是否位于该平面内(或者非常接近)。

这很容易用矩阵表示,而不是通过操纵上面列出的代码片段中的各个坐标组件来表示。以下链接显示如何使用矩阵来解决此问题和相关问题:http://paulbourke.net/geometry/planeeq/

看起来您的代码已经接近代表平面的方程(您可以通过替换原始点来验证它是否计算为零或接近零)。

接下来,替换候选点以查看它是否计算为零或接近于零。

+0

我的意图是在两个坐标之间的块游戏中绘制一架飞机,前三个坐标帮助定义平面,而最后两个坐标定义飞机将绘制的空间。现在,如果飞机不是水平的,垂直的或者两个变量之间的关系为1,那么恰好在飞机上的点有点散射,但我希望有一些飞机可以尽可能最好地绘制最接近飞机的位置以及确切点。 – joseph

+0

我的确尝试做一些事情,看它是否接近零,就像答案是<1 and > -1或类似的东西,但它仍然无效。 – joseph

+0

我用一条线给出了一个例子:假设我有一个从0到4的线y = 2x的方程,如果在这样的图上绘制,我会得到一条线:[00000] [01000 ] [00000] [10000]。按照此处所示堆叠矩阵,看看我的意思,因为这应该是发生情况的可视化表示。我真正想要的是这样的东西:[10000] [10000] [10000]。或者能够获得连接线的东西。 – joseph