已知反射点和反射向量,如何用c语言求反射向量与圆柱面的交点坐标?

已知反射点的三维坐标和反射向量的三维数组,用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作为参数,返回一个交点的结构体