C++ 几何算法 - 向量点乘,叉乘及其应用

news2024/11/15 18:51:15

一:点乘介绍

        1. 向量点乘:

        

        2. 向量点乘的性质:

        

       3. 向量点乘公式:

        

        

        

      4. 向量的点乘的属性:

        (1):向量与自身做点乘,会得到向量长度的平方:

        (2):向量长度,为向量与自身点乘后再求平方根:

        (3):向量投影,将a向量投影到向量b上:

        (4):向量夹角:

二:叉乘介绍:

        1. 向量叉乘:

           

        2. 向量叉乘公式:

         

        3. 向量叉乘的属性:

                判断三个向量是否共面:

三:应用1 - 求两直线的交点:

        (1)2D直线方程:

        (2)将直线1带入直线2中:  ,叉乘等于0,意味着两向量共线。

        (3)求交点:

                

四:应用2 - 求三个平面的交点:

        (1):三个平面方程:

                

        (2):三个平面方程,三个未知数,利用克拉默法则求解即可。

三:实现

#ifndef _POINT_H_
#define _POINT_H_

#include <iostream>
#include <cmath>

class Point2D
{
public:
	float x, y;
	Point2D() {}
	Point2D(float x, float y) : x(x), y(y) {}
	Point2D &operator+=(const Point2D &t)
	{
		x += t.x;
		y += t.y;
		return *this;
	}
	Point2D &operator-=(const Point2D &t)
	{
		x -= t.x;
		y -= t.y;
		return *this;
	}
	Point2D &operator*=(float t)
	{
		x *= t;
		y *= t;
		return *this;
	}
	Point2D &operator/=(float t)
	{
		x /= t;
		y /= t;
		return *this;
	}
	Point2D operator+(const Point2D &t) const
	{
		return Point2D(*this) += t;
	}
	Point2D operator-(const Point2D &t) const
	{
		return Point2D(*this) -= t;
	}
	Point2D operator*(float t) const
	{
		return Point2D(*this) *= t;
	}
	Point2D operator/(float t) const
	{
		return Point2D(*this) /= t;
	}

	float dot(const Point2D& b) const
	{
		return x * b.x + y * b.y;
	}

	friend std::ostream &operator<<(std::ostream &out, const Point2D &t)
	{
		out << '(' << t.x << ',' << t.y << ')';
		return out;
	}

};

Point2D operator*(float a, const Point2D &b)
{
	return b * a;
}

float dot(const Point2D& a, const Point2D& b)
{
	return a.dot(b);
}

float norm(const Point2D& a)
{
    return dot(a, a);
}

double abs(const Point2D& a) {
    return sqrt(norm(a));
}

double proj(const Point2D& a, const Point2D& b)
{
    return dot(a, b) / abs(b);
}

double angle(const Point2D& a, const Point2D& b)
{
    return acos(dot(a, b) / abs(a) / abs(b));
}

float cross(const Point2D& a, const Point2D& b)
{
    return a.x * b.y - a.y * b.x;
}

Point2D intersect(const Point2D& a1, const Point2D& d1, const Point2D& a2, const Point2D& d2)
{
    return a1 + cross(a2 - a1, d2) / cross(d1, d2) * d1;
}


class Point3D: public Point2D
{
public:
	float z;
	Point3D() {}

	Point3D(float x, float y, float z) : Point2D(x, y), z(z) {}

	Point3D &operator+=(const Point3D &t)
	{
		x += t.x;
		y += t.y;
		z += t.z;
		return *this;
	}

	Point3D &operator-=(const Point3D &t)
	{
		x -= t.x;
		y -= t.y;
		z -= t.z;
		return *this;
	}

	Point3D &operator*=(float t)
	{
		x *= t;
		y *= t;
		z *= t;
		return *this;
	}

	Point3D &operator/=(float t)
	{
		x /= t;
		y /= t;
		z /= t;
		return *this;
	}

	Point3D operator+(const Point3D &t) const
	{
		return Point3D(*this) += t;
	}

	Point3D operator-(const Point3D &t) const
	{
		return Point3D(*this) -= t;
	}

	Point3D operator*(float t) const
	{
		return Point3D(*this) *= t;
	}

	Point3D operator/(float t) const
	{
		return Point3D(*this) /= t;
	}

	float dot(const Point3D &t) const
	{
		return x * t.x + y * t.y + z * t.z;
	}

	friend std::ostream &operator<<(std::ostream &out, const Point3D &t)
	{
		out << '(' << t.x << ',' << t.y << ',' << t.z << ')';
		return out;
	}
};

Point3D operator*(float a, Point3D b)
{
	return b * a;
}

float dot(const Point3D& a, const Point3D& b) 
{
    return a.dot(b);
}

float norm(const Point3D& a) 
{
    return dot(a, a);
}

double abs(const Point3D& a) {
    return sqrt(norm(a));
}

double proj(const Point3D& a, const Point3D& b)
{
    return dot(a, b) / abs(b);
}

double angle(const Point3D& a, const Point3D& b)
{
    return acos(dot(a, b) / abs(a) / abs(b));
}

Point3D cross(const Point3D& a, const Point3D& b)
{
    return Point3D(a.y * b.z - a.z * b.y,
                   a.z * b.x - a.x * b.z,
                   a.x * b.y - a.y * b.x);
}

float triple(const Point3D& a, const Point3D& b, const Point3D& c) 
{
    return dot(a, cross(b, c));
}

Point3D intersect(const Point3D& a1, const Point3D& n1, const Point3D& a2, const Point3D& n2, const Point3D& a3, const Point3D& n3) 
{
    Point3D x(n1.x, n2.x, n3.x);
    Point3D y(n1.y, n2.y, n3.y);
    Point3D z(n1.z, n2.z, n3.z);
    Point3D d(dot(a1, n1), dot(a2, n2), dot(a3, n3));
    return Point3D(triple(d, y, z),
                   triple(x, d, z),
                   triple(x, y, d)) / triple(n1, n2, n3);
}

#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM系列 | 对象的消亡3——垃圾收集器的对比与实现细节

垃圾收集器 文章目录 各收集器简单对比收集器启动参数各收集器详细说明JDK 1.3 之前JDK 1.3 | SerialJDK 1.4 | ParNewJDK 1.4 | Parallel ScavengeJDK 5 | CMS 收集器JDK 7 | G1 各收集器简单对比 收集器名称出现时间淘汰时间目标采用技术线程数STW分代备注无名JDK 1.3之前JD…

Android 自定义View(一):View是什么?如何创建自定义view,自定义属性等

目录 1&#xff09;View是什么&#xff1f; 2&#xff09;View分类 3&#xff09;View的知识点 4&#xff09;View的工作流程是怎么样的&#xff1f; 5&#xff09;案例&#xff1a;如何自定义View&#xff1f;比如我们要实现一个输入框带有清除按钮的view 6&#xff09;疑问&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 免单统计(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题…

0805作业+梳理

一、作业&#xff1a; 代码&#xff1a; create.c #include<myhead.h> int main(int argc, const char *argv[]) {//创建一个有名管道文件if(mkfifo("./linux",0664)-1){perror("mkfifo linux error");return -1;}getchar();system("rm linux…

8.15 C++作业

输入一组字符&#xff0c;实现各字符的归类统计 #include <iostream> #include <string.h>using namespace std;namespace xiaoli {string str;int len; } using namespace xiaoli;int main() {getline(cin,str);//识别空格len str.size();int a0,b0,c0,d0,e0;fo…

x-cmd mod | x yq - 轻量级的 YAML、JSON、XML 处理器

目录 简介使用语法参数子命令x yq repl 简介 yq (YAML Query) 是一个轻量级的 YAML、JSON、XML 处理器&#xff0c;主要用于查询和提取 YAML 数据。 x yq 是基于 yq 命令、为提升 yq 使用体验而设计的增强模块&#xff0c;具体的增强性改动如下&#xff1a; 简化 yq 命令的安…

【GoodERP更新日志】增加模块 质检管理 处理来料检、发货检功能

开源项目GoodERP更新-2024年8月5日 本次提交合并增加的功能或解决的问题&#xff1a;增加 质量管理模块->增加来料质检、发货质检功能 提交前: 无 提交后: 1、按供应商来料&#xff0c;安排来料质检工作&#xff1b; 2、按销售订单&#xff0c;安排对计划发货商品进行…

比较推荐哪种可视耳勺?5大热门产品专业测评分享!

由于现在人们对健康生活越来越重视&#xff0c;可视耳勺成为了个护健康产品&#xff0c;受到了越来越多消费者的关注和喜爱。这种挖耳勺采用了先进的无线技术和高清摄像头&#xff0c;能够让人们更加清晰地观察自己耳内的状况&#xff0c;从而更加安全、有效地清洁耳朵。但同时…

封装组件之使用vue3封装简易Button按钮

1.新建Button.vue <template><button :class"buttonClass"><!-- 用于输入内容 --><slot></slot></button> </template> <script lang"ts" setup> import { computed } from vue; //定义类型 const props…

OpenGL投影矩阵

OpenGL Projection Matrix OpenGL投影矩阵

大模型检索增强生成RAG

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlRAG简介 大模型检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种结合了信息检索技术和语言生成模型的人工智能技术,主要用于增强大型语言模型(Large Language Models, LLMs)处理…

能见度监测站在机场中的应用

在繁忙的机场&#xff0c;每一个细节都关乎着飞行安全。其中&#xff0c;能见度作为关键的气象因素&#xff0c;直接影响着飞机的起降安全。为此&#xff0c;能见度监测站在机场中扮演着重要的角色。 能见度监测站利用先进的传感器技术&#xff0c;实时监测机场周边的能见度情况…

【医学图像】医学图像基础

目录 引言 医学成像常识 1. 正交投影面 2 医学图像种类 3 医学图像质量评价标准 3.1 图像对比度成因 3.2 对比度 3.3 空间分辨率 3.4 时间分辨率 3.5 信噪比 signal-to-noise ratio SNR 3.6 数字和模拟图像 4 医疗临床的性能 4.1 图像获取和感知 4.2 灵敏度和特异…

WEB服务器安全加固与检查

01.安全加固定义 什么是安全加固? 安全加固是实现信息系统安全的关键环节。通过安全加固&#xff0c;将在信息系统的网络层、主机层、软件层、应用层等层次建立符合安全需求的安全状态&#xff0c;并以此作为保证网络信息系统安全的起点。 安全加固是配置软件…

使用gitea私有仓库作为依赖

实际问题 由于公司团队使用gitea搭建了git私有仓库&#xff0c;在开发Go程序的时候会有一些公共代码&#xff0c;比如插件和主程序之间要共享接口和数据结构&#xff0c;所以就需要在gitea私有仓库中创建依赖仓库&#xff0c;然后其他仓库引用这个私有仓库作为依赖。 解决方案…

记录|LabVIEW从0开始【09~10】

目录 前言一、属性节点案例&#xff1a;Step1. 表格控件设置Step2. 下拉列表控制Step1~Step2 效果展示Step3. 编写事件分支分支1&#xff1a;前面板关闭&#xff1f;分支2&#xff1a;表格&#xff0c;鼠标按下创建分支创建表格引用获得单元格的2种位置。设置下拉框的位置下拉框…

【秋招笔试题】矿脉开采(树形DP)

此题直接按树形dp做即可&#xff0c;每次从0枚举到k转移状态 #include <iostream> #include <cstring> #include <algorithm>using namespace std; #define endl \n #define lson node << 1 #define rson node << 1 | 1 const int maxn 1e5 5…

未授权访问漏洞系列详解⑥!

JBoss未授权访问漏洞 JBoss是一个基于J2EE的开放源代码应用服务器&#xff0c;代码遵循LGPL许可&#xff0c;可以在任何商业应用中免费使用;JBoss也是一个管理EJB的容器和服务器&#xff0c;支持EJB1.1、EJB 2.0和EJB3规范。,默认情况下访问 http://ip:8080/jmx-console 就可以…

宠物空气净化器哪个牌子好?希喂、霍尼韦尔宠物空气净化器对比推荐

随着养宠物人群变多&#xff0c;现在打着宠物专用旗号的空气净化器也越来越多&#xff0c;但是很多空气净化器对宠物的效果&#xff0c;真的是只有宣传上和宠物有关&#xff0c;实际设计和效果上和宠物毫无关系。需要大家擦亮眼睛&#xff0c;多做功课&#xff0c;才能不被那些…

PXE+kickstart实现无人值守自动安装操作系统

PXEkickstart实现无人值守自动安装操作系统 让待安装系统的主机自动安装系统&#xff0c;并且自动的安装kickstart文件安装系统&#xff0c;不需要人工干预&#xff0c;直接自动化批量安装操作系统 文章目录 PXEkickstart实现无人值守自动安装操作系统在VMware虚拟机中进行操作…