当前位置: 首页 > article >正文

计算几何学习,第一天

向量运算,点线关系

点积:a·b=|a||b|cosθ
几何意义:向量b在向量a上的投影与a的长度的乘积
坐标运算:a·b=x1*x2+y1*y2
应用
        1.判断两向量垂直a·b=0

        2.判断两向量平行a·b=|a||b|

        3.求两向量的夹角cosθ=a·b/|a||b|
证明:
a·b=abcosθ=ab*(a^2+b^2-c^2)/2ab
={(x1^2+y1^2)+(x2^2+y2^2)-[(x1-x2)^2+(y1-y2)^2]}/2
=x1*x2+y1*y2
 

operator知识复习

自定义的operator+运行流程
friend Point operator+(Point a, const Point& b) {
    return a += b;
}
定义一个全局的友元函数,然后执行a+=b操作

operator+=的运行流程
Point& operator+=(const Point& p)& {
    x += p.x;
    y += p.y;
    return *this;
}
调用自身成员的x,y,加上另一个成员的变量
*this返回的是当前对象的引用而不是拷贝
比如说a+=b会变成
a.operator+=(b),左值接受*this的返回

例如
Point p3=p1+p2
转换成p3=Point.operator+(p1,p2)
a=p1;
转换成p3=Point.operator+(a,p2)
转换成p3=a.operator+=(p2)
转换成a=*this
转换成p3=a

下面是基本的点的结构与功能

template<class T>
struct Point {
    T x;
    T y;
    //初始值设为0
    Point(const T& x_ = 0, const T& y_ = 0) :x(x_), y(y_) {}
    //类型转换模版
    //Point<int> p1(3, 4);       定义一个整数点
    //Point<double> p2 = p1;     转换为双精度点
    template<class U>
    operator Point<U>() {
        return Point<U>(U(x), U(y));
    }
    Point& operator+=(const Point& p)& {
        x += p.x;
        y += p.y;
        return *this;
    }
    Point& operator-=(const Point& p)& {
        x -= p.x;
        y -= p.y;
        return *this;
    }
    Point& operator*=(const T& v)& {
        x *= v;
        y *= v;
        return *this;
    }
    Point& operator/=(const T& v)& {
        x /= v;
        y /= v;
        return *this;
    }
    friend Point operator+(Point a, const Point& b) {
        return a += b;
    }
    friend Point operator-(Point a, const Point& b) {
        return a -= b;
    }
    friend Point operator*(Point a, const T& b) {
        return a *= b;
    }
    friend Point operator/(Point a, const T& b) {
        return a /= b;
    }
    friend Point operator*(const T& a, Point b) {
        return b *= a;
    }
    friend bool operator==(const Point& a, const Point& b) {
        return a.x == b.x && a.y == b.y;
    }
    friend std::istream& operator>>(std::istream& is, Point& p) {
        return is >> p.x >> p.y;
    }
    friend std::ostream& operator<<(std::ostream& os, const Point& p) {
        return os << "(" << p.x << ", " << p.y << ")";
    }
};

template<class T>//a和b的点积
T dot(const Point<T>& a, const Point<T>& b) {
    return a.x * b.x + a.y * b.y;
}

template<class T>
T square(const Point<T>& p) {
    return dot(p, p);
}

template<class T>//求模长
double length(const Point<T>& p) {
    return std::sqrt(square(p));
}
template<class T>//求cosθ
double angle(Point<T> a, Point<T> b) {
    return std::acos(dot(a, b) / length(a) / length(b));
}


http://www.kler.cn/a/421897.html

相关文章:

  • 稳定运行的以Azure Synapse Dedicated SQL Pool数据仓库为数据源和目标的ETL性能变差时提高性能方法和步骤
  • linux磁盘管理
  • C++设计模式之享元模式
  • 知乎大数据开发面试题及参考答案
  • Redis使用场景-缓存-缓存雪崩
  • 网络安全框架及模型-PPDR模型
  • JAVA设计模式,责任链模式
  • MySQL删除数据要谨慎
  • Linux(完善中)
  • 基于Matlab三点雨流计数法的载荷时间历程分析与循环疲劳评估
  • URDF(描述机器人模型)和SDF(Gazebo中用于描述仿真环境)
  • 前端request拦截器自定义参数时,后端允许跨域的拦截器要加上对应的自定义参数不然会引起访问跨域
  • 【安卓开发】【Android Studio】项目构建(Build)时报错:Integer Overflow
  • GoReplay工具middlware使用(python版本)
  • 云原生和数据库哪个好一些?
  • case判断年份是否为闰年
  • redis 从16db块 加到32db块
  • Goland2024.3 发布,有点东西
  • 开发一套ERP 第十弹 图片作为配置文件,本地读取图片,定时更新图片类型
  • [高等数学学习记录] 泰勒公式
  • 【Linux】vim编辑器
  • ORB-SLAM2 ----- LocalMapping::ComputeF12和ORBmatcher::CheckDistEpipolarLine
  • C++ 封闭函数局部变量不能在 lambda 体中引用,除非其位于捕获列表中
  • Golang教程第25篇(并发)
  • G0、G1、G2连续在曲线和曲面的设计和制造中重要性体现在哪里
  • 工业智能网关在该企业中的应用实践