当前位置: 首页 > news >正文

如何在三维空间中生成任意方向的矩形内部点位坐标 - 实践

场景:控制库卡六轴机械臂等在空间中运动,要求根据配置的3个点位(左上,左下,右上)进行计算,算出这3个点在空间中构成的矩形,计算出在这个矩形中(即不包括边界点位),等距离间隔的所有点位坐标。局部坐标系转换成全局坐标系可以处理空间中任意方向的矩形。无需考虑平面定义xoy,zoy,xoz。

理论依据

基于向量的线性组合和坐标变换原理。假设入参是三个点 P₁(x₁,y₁,z₁), P₂(x₂,y₂,z₂), P₃(x₃,y₃,z₃),最初判断这三个点是否允许形成一个矩形。向量 P₁P₂ 和 P₁P₃需垂直,即点积为0。然后计算出第四个点P₄ = P₁ + (P₂ - P₁) + (P₃ - P₁) = (x₂ + x₃ - x₁, y₂ + y₃ - y₁, z₂ + z₃ - z₁)。结果建立全局坐标系,生成所有点位。

C#版代码实现:

public class Point
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }

public Point(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}

public override string ToString()
{
return $"({X}, {Y}, {Z})";
}
}

public class GetCoordinates3D
{
public static List<Point> getPoints(Point p1, Point p2, Point p3, double dist )
{
/* u,v计算向量*/
Vector3D u = new Vector3D(p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z);
Vector3D v = new Vector3D(p3.X - p1.X, p3.Y - p1.Y, p3.Z - p1.Z);

if (Math.Abs(Vector3D.Dot(u, v)) > 0.0001)
{
throw new ArgumentException("无法构成矩形,请重新输入三个点位参数");
}


double length = u.Magnitude();//长度
double width = v.Magnitude();//宽

// 计算点范围
List<double> xSteps = new List<double>();
List<double> ySteps = new List<double>();

for (double x = dist; x < length; x += dist)
{
xSteps.Add(x);
}

for (double y = dist; y < width; y += dist)
{
ySteps.Add(y);
}


List<Point> points = new List<Point>();//点位集合定义

// 单位向量
Vector3D uUnit = u.Normalize();
Vector3D vUnit = v.Normalize();

foreach (double x in xSteps)
{
foreach (double y in ySteps)
{
// 转换到全局坐标系
Point point = new Point(
p1.X + x * uUnit.X + y * vUnit.X,
p1.Y + x * uUnit.Y + y * vUnit.Y,
p1.Z + x * uUnit.Z + y * vUnit.Z
);
points.Add(point);
}
}

return points;
}
}

public class Vector3D
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }

public Vector3D(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}

public double Magnitude()
{
return Math.Sqrt(X * X + Y * Y + Z * Z);
}

public Vector3D Normalize()
{
double mag = Magnitude();
if (mag == 0)
return new Vector3D(0, 0, 0);

return new Vector3D(X / mag, Y / mag, Z / mag);
}

public static double Dot(Vector3D a, Vector3D b)
{
return (a.X * b.X + a.Y * b.Y + a.Z * b.Z);
}
}

class Program
{
static void Main(string[] args)
{
try
{
/*测试参数XYZ,点位间距10*/

Point p1 = new Point(0, 0, 0);
Point p2 = new Point(100, 0, 0);
Point p3 = new Point(0, 50, 0);

List<Point> points = GetCoordinates3D.getPoints(p1, p2, p3, 10);

Console.WriteLine($"生成 {points.Count} 点位");
Console.WriteLine("以下是点坐标:");

for (int i = 0; i < points.Count; i++)
{
Console.WriteLine($"点{i + 1}: {points[i]}");
}
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
}
}
}

http://www.jsqmd.com/news/355590/

相关文章:

  • Lmkd查杀功能的详细步骤 - 实践
  • signal and making language
  • Python系列基础教程(三)Python比较与逻辑运算符、条件判断语句
  • 彻底解决 Node.js 报错:Assertion failed: new_time >= loop->time, file src\win\core.c, line 327
  • 2026国内最新沉香手串供应链top5推荐!广东广州等地优质沉香手串厂家权威榜单发布,品质正宗助力香道品鉴与收藏 - 品牌推荐2026
  • Python系列基础教程(四)Python while与for循环
  • 鼻窦ct检查做什么,多少钱?这个和鼻内镜什么区别
  • 2026年正规的实验室冷冻干燥机,小型冷冻干燥机厂家推荐及选购参考榜 - 品牌鉴赏师
  • 青铜器皿怎么三维锈蚀分析?思看科技多时相三维比对方案解析
  • 公安心理测评系统新坐标:为何“星云星空”是警务心理的必选项? - 健成星云
  • 从已读不回到薪资涨幅30%,这个AI简历优化太狠了
  • 2026年评价高的红外加热浓缩仪,毒物检测离心浓缩仪厂家优质供应商榜单 - 品牌鉴赏师
  • the a words disappears.
  • 致每一位在代码世界里策马奔腾的你:2026农历新年快乐
  • easy girl
  • 【计算机毕设】java-springboot+vue“智慧食堂”设计与实现
  • 这份书单让你彻底读懂商业模式
  • 【计算机毕设】java-springboot+vue“漫画之家”系统毕业设计
  • 当暴雪来袭:软件系统的容错启示录
  • ‌经济下行应对:取消失败测试的情感共鸣点
  • 主流门店管理软件对比,为商家提供选型思路
  • ‌赛事数据测试:实时比分系统准确性验证
  • GPU服务器:驱动人工智能与科学计算的关键基础设施
  • API集成平台:构建企业数字化连接的核心引擎
  • 用户行为热点:登录峰值测试与优化
  • 看了这么多人力资源管理书籍,这是最适合HR的书单
  • 使用淘宝闪购外卖红包下单有什么限制吗?
  • 文化事件嫁接:本地化测试中的敏感场景处置方法论
  • Java并发编程进阶:线程池原理、参数配置与死锁避免实战
  • STM32-TIM-输出比较