已知反射点的三维坐标和反射向量的三维数组,用C语言如何求出反射向量与圆柱面的交点坐标
#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作为参数,返回一个交点的结构体