unity 点到线段最短距离和点离线段最近的点

以下代码是以Scorpio(天蝎座)的语法编写的,其中的“ array.add”就是为数组添加元素的意思,整段逻辑没有错,要是想直接用的话就用C#重写一遍就行

//两点之间距离
Tool.Distance = function (a, b) {
	var L = Vector3.Distance(a, b);
	print(L);
	return L;
}
//点到线段距离
Tool.DistanceLine = function (p1, p2, p3) // a和b是线段的两个端点,c是检测点
{
	// var a = Vector3(59, 0.1, 90);
	// var b = Vector3(64, 0.1, 57);
	var a = p1;
	var b = p2;
	var c = p3;
	var ab = b - a;
	var ac = c - a

	// // var f = ab * ac;
	var f = ab.x * ac.x + ab.y * ac.y + ab.z * ac.z;

	if (f < 0) {
		var item = [];
		array.add(item, Tool.Distance(a, c));
		array.add(item, a);
		return item;
	}

	// // var d = ab * ab;
	var d = ab.x * ab.x + ab.y * ab.y + ab.z * ab.z;

	if (f > d) {
		var item = [];
		array.add(item, Tool.Distance(b, c));
		array.add(item, b);
		return item;
	}

	//以上两种情况返回的是线段的两端,如果都不符合说明监测点到线段的垂足是在线段内的
	var k = f / d;
	//D就是垂足点
	var D = a + Vector3(k * ab.x, k * ab.y, k * ab.z);

	//这是另一种方法只不过计算量大了一些
	// var D = Vector3(0, 0, 0);
	// if (a.x == b.x) {
	// 	// AB is vertical
	// 	D.x = a.x;
	// 	D.y = c.y;
	// } else if (a.y == b.y) {
	// 	// AB is horizontal
	// 	D.x = c.x;
	// 	D.y = a.y;
	// } else {
	// 	// linear function of AB
	// 	var m1 = (b.y - a.y) / (b.x - a.x);
	// 	var t1 = a.y - m1 * a.x;
	// 	// linear function of PC
	// 	var m2 = -1 / m1; // perpendicular
	// 	var t2 = c.y - m2 * c.x;
	// 	// c.x * m1 + t1 === c.x * m2 + t2
	// 	D.x = (t2 - t1) / (m1 - m2);
	// 	D.y = m1 * D.x + t1;
	// }

	var item = [];
	array.add(item, Tool.Distance(c, D));
	array.add(item, D);
	return item;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dawn·张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值