如何拟合方程的最近点?python

如何拟合方程的最近点?python,python,list,increment,equation,points,Python,List,Increment,Equation,Points,基本上我有一些代码,它会找到一个平面的方程,然后尝试在列表中放置一个1,如果一个点满足直线的方程,否则列表中会放置一个0。 不幸的是,必须有一个增量,那么你如何得到一个最接近方程的点,这样一个近似平面就可以在没有一堆空白的情况下生成呢 以下是迄今为止的代码: def plane(self): p1 = self.first_pos p2 = self.second_pos p3 = self.third_pos x1,y1,z1 = self.fourth_pos

基本上我有一些代码,它会找到一个平面的方程,然后尝试在列表中放置一个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()

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

这最容易用矩阵表示,而不是通过操作上面列出的代码片段中的各个坐标组件。这里有一个链接显示如何使用矩阵来解决此问题和相关问题:

看起来你的代码已经接近于表示平面的方程了,你可以通过替换原始点来验证它,看看它的计算结果是零还是接近零


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

您的问题是由完成的二维直线绘制的三维版本。B-A使用网格中的单元(包括连接单元)绘制线,以便获得连续线。也就是说,B-A不是一列一列地建立索引,并为等效x值计算适当的单元(如果直线不是完全垂直、水平或45度,则会在点之间留下空间),而是从一个单元移动到另一个单元,确定哪个相邻单元最适合绘制的线性方程


通过在x中绘制每个线性切片,然后在y中再次绘制每个切片,可以使其适应三维。实现留给OP作为练习。Wikipedia页面包含一些用于n维处理的链接。

这是一个编程问题还是一个数学问题还不是很清楚——不管怎样,这里有很多代码,但没有很多上下文。如果没有更多的信息,我不确定我们能帮到你。问题是,如果现在平面不是水平的,垂直的,或者两个轴之间的关系是1,那么结果列表中的曲面怎么可能尽可能接近实际平面,这里不会有一个曲面,而是一个1的分散体,中间有0。我的目的是在两个坐标之间的块游戏中绘制一个平面,前三个坐标帮助定义平面,而后两个坐标定义绘制平面的空间。现在,如果平面不是水平的,垂直的,或者两个变量之间的关系不是1,在平面上有一个分散的点,但是我想用离平面最近的点和精确的点,尽可能地画出平面。我试着做了一些事情,看看它是否接近零,比如答案是-1或者类似的东西,但它仍然不起作用。我举一个例子,用一条直线:假设我有一条直线y=2x的方程,从0到4,如果画在这样的图上,我会得到一条直线:[00100][00000][01000][00000 10000]。如图所示堆叠矩阵,以了解我的意思,因为这应该是所发生情况的可视化表示。我真正想要的是这样的东西:[00100][01000][01000][10000][10000]。或者是一些可以连接的线路。感谢你澄清这是OP真正想要的。代码表示努力确定一个点到由三个点定义的平面的接近程度。总体目标还不清楚,我还在猜测。也许应该在我的答案前加上一个大的“我认为”。