当前位置: 首页 > 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.dtcms.com/a/611037.html

相关文章:

  • 微信如何做网站西安网站制作托
  • 石家庄网站服务万维网的网站
  • leetcode 387. 字符串中的第一个唯一字符 python
  • 基于深度学习的磁共振图像膝关节损伤多标签识别系统研究
  • 网站制作工作室24小时接单微信小游戏源码
  • 做网站会出现什么问题wordpress如何更改上传文件大小
  • vue3 组合式 API 详解
  • C++从入门到实战----类和对象(上)
  • 多维度表征(下)|用扫描电镜,CT 与仿真“看透“再生碳纤维复合材料
  • 电商网站 收费与免费wordpress阿里云图片不显示不出来
  • 易语言模块反编译为源码 | 深入分析与实战教程
  • 在高速公路或交通工程领域中,OD 是 Origin-Destination 的缩写,中文通常称为“起讫点”或“出行起止点”。
  • 诏安建设局网站常德网站seo
  • 牛商网做的网站怎么样仓库进销存软件
  • Windows 7 运行 .NET 应用时报错“hostfxr.dll 加载失败 (HRESULT: 0x80070057)”的彻底解决指南
  • 免费手机网站系统WordPress使用中文链接好吗
  • 深入理解 C++ vector 源码与迭代器失效问题
  • 服务器主板选用网络变压器及参数配置HX82409S
  • 厦门网站建设企业网站的邀请怎么做的
  • 单独Docker部署和Docker Compose部署
  • 推动“AI+ 网络安全”深度融合与创新发展
  • 个人网站开发技术网站如何做免费推广
  • 网站建设惠州房屋室内设计用什么软件
  • oracle 12c查看执行过的sql及当前正在执行的sql
  • bulk转录组测序分析之数据清洗
  • 深圳网站的公司做网站大概需要多少钱
  • 建立门户公司网站郑州 网站建设
  • MySQL 配置文件属性详解
  • chunk_overlap(通常译为“分块重叠度”)
  • CSFAFormer:用于多模态遥感图像语义分割的类别选择性特征聚合 Transformer