已知反射点的三维坐标和反射向量的三维数组,用C语言如何求出反射向量与圆柱面的交点坐标
1条回答 默认 最新
- 「已注销」 2023-05-29 08:22关注
#include <stdio.h> #include <math.h> struct Point { double x, y, z; }; struct Vector { double x, y, z; }; struct Cylinder { double r, h; }; struct Intersection { struct Point point; struct Vector normal; }; struct Intersection intersect(struct Point p, struct Vector v, struct Cylinder c) { struct Intersection result; double a = v.x * v.x + v.y * v.y; double b = 2 * (p.x * v.x + p.y * v.y); double c = p.x * p.x + p.y * p.y - c.r * c.r; double delta = b * b - 4 * a * c; if (delta < 0) { result.point.x = NAN; result.point.y = NAN; result.point.z = NAN; result.normal.x = NAN; result.normal.y = NAN; result.normal.z = NAN; } else { double t1 = (-b + sqrt(delta)) / (2 * a); double t2 = (-b - sqrt(delta)) / (2 * a); if (t1 > 0 && t2 > 0) { double t = fmin(t1, t2); result.point.x = p.x + t * v.x; result.point.y = p.y + t * v.y; result.point.z = p.z + t * v.z; result.normal.x = result.point.x; result.normal.y = result.point.y; result.normal.z = 0; } else if (t1 < 0 && t2 < 0) { result.point.x = NAN; result.point.y = NAN; result.point.z = NAN; result.normal.x = NAN; result.normal.y = NAN; result.normal.z = NAN; } else { double t = fmax(t1, t2); result.point.x = p.x + t * v.x; result.point.y = p.y + t * v.y; result.point.z = p.z + t * v.z; result.normal.x = result.point.x; result.normal.y = result.point.y; result.normal.z = 0; } } return result; }
Point表示点的结构体,Vector表示向量的结构体,Cylinder表示圆柱体的结构体,Intersection表示交点的结构体。intersect函数接受一个点P、一个向量V和一个圆柱体C作为参数,返回一个交点的结构体
解决 无用评论 打赏 举报
悬赏问题
- ¥15 FileNotFoundError 解决方案
- ¥15 uniapp实现如下图的图表功能
- ¥15 u-subsection如何修改相邻两个节点样式
- ¥30 vs2010开发 WFP(windows filtering platform)
- ¥15 服务端控制goose报文控制块的发布问题
- ¥15 学习指导与未来导向啊
- ¥15 求多普勒频移瞬时表达式
- ¥15 如果要做一个老年人平板有哪些需求
- ¥15 k8s生产配置推荐配置及部署方案
- ¥15 matlab提取运动物体的坐标