平面坐标里计算点到线段的垂足问题
如图,以左上为原点的坐标图,坐标都为正
已知任意直线的点A,B, 和直线外一点C
目前用向量法还是直线方程的方法,然后都有偏移的情况 。
向量法结果在A点,直线方程结果在CB线上。
(另外线AB方向是不确定的,可能是AB也可能是BA, 可能是各种方向上)
现在的方法有时是正常的,有时是错误的, 图上是错误时的用例
向量法
// 求垂足座标, C(x0,y0), A(x1, y1) B(x2, y2)
func VerticalAix(x0, y0, x1, y1, x2, y2 int) (int, int) {
dx := x1 - x2
dy := y1 - y2
if math.Abs(float64(dx)) < 0.00000001 && math.Abs(float64(dy)) < 0.00000001 {
return x0, y0
}
u := (x0-x1)*(x1-x2) +
(y0-y1)*(y1-y2)
u = u / ((dx * dx) + (dy * dy))
x := x1 + u*dx
y := y1 + u*dy
return x, y
}
直线方程
// 求垂足座标 C(x0,y0), A(x1, y1) B(x2, y2)
func VerticalAix(x0, y0, x1, y1, x2, y2 int) (int, int) {
if x2-x1 == 0 {
return x2, y0
}
// 算斜率
k1 := (y2 - y1) / (x2 - x1)
// 垂足x坐标
x := (math.Pow(float64(k1), 2)*float64(x1) + float64(k1*(y0-y1)) + float64(x0)) / (math.Pow(float64(k1), 2) + 1)
y := float64(k1)*(x-float64(x1)) + float64(y1)
return int(x), int(y)
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
http://jsrun.net/MaIKp/edit
从网上随便找了个公式套了进去,看上去是没问题的
结帖, 本帖子所有公式都是对的,区别在于, go 里int/int结果还是int, 如果区间是0-1之间的数会变成0
又被基础问题坑了你到底是求平面外一点到平面的垂线,还是求直线外一点到平面的垂线?
这个完全是不同的啊。