weixin_58340749 2021-05-19 19:55 采纳率: 0%
浏览 8

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

已知反射点的三维坐标和反射向量的三维数组,用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提取运动物体的坐标