如何在nalgebra中对两点取平均值?如何用边中点生成三角形?
嘿,我来帮你解决这两个nalgebra相关的问题,都是关于点的中点计算的,刚好关联度很高!
问题1:如何在nalgebra中对两个点取平均值?
nalgebra的设计严格遵循了几何数学定义:点(Point)代表空间中的固定位置,而向量(Vector)代表位置之间的位移——所以直接让两个点相加是不符合逻辑的(你没法把两个“位置”直接加起来呀)。要计算两个点的平均值(也就是中点),有两种简单可行的方式:
- 方式一:手动转换坐标
把点通过.coords属性转换成对应的向量,完成加法和除法运算后,再转回Point类型:
use nalgebra::Point2; let a = Point2::new(1.0, 2.0); let b = Point2::new(3.0, 4.0); let midpoint = Point2::from((a.coords + b.coords) / 2.0);
- 方式二:使用内置的
midpoint方法
nalgebra已经为Point类型实现了Midpointtrait,直接调用就能一键得到中点,代码更简洁:
let midpoint = a.midpoint(&b);
这个方法内部已经帮你处理了坐标转换的细节,可读性拉满~
问题2:修复生成中点三角形的报错代码
你的代码报错的核心原因就是刚才说的:nalgebra不允许直接对Point2实例执行加法操作。我们可以用上面的两种方法来修改代码,这里推荐用内置的midpoint方法,代码更清晰直观:
修复后的完整代码
use nalgebra::Point2; fn get_def(a: Point2<f32>, b: Point2<f32>, c: Point2<f32>) -> [Point2<f32>; 3] { let d = a.midpoint(&b); let e = b.midpoint(&c); let f = c.midpoint(&a); [d, e, f] }
如果你更倾向于手动控制坐标运算的过程,也可以写成下面这种形式:
use nalgebra::Point2; fn get_def(a: Point2<f32>, b: Point2<f32>, c: Point2<f32>) -> [Point2<f32>; 3] { let d = Point2::from((a.coords + b.coords) / 2.0); let e = Point2::from((b.coords + c.coords) / 2.0); let f = Point2::from((c.coords + a.coords) / 2.0); [d, e, f] }
两种写法都能正常编译运行,选你觉得更顺手的就行~
内容的提问来源于stack exchange,提问作者Jeroen
相关产品推荐
相关产品推荐

