首页 > 其他分享 >【学习笔记】【数学】计算几何基础

【学习笔记】【数学】计算几何基础

时间:2023-08-08 17:15:37浏览次数:37  
标签:node Node cos 笔记 数学 il 几何 theta sin

点击查看目录

目录

前置知识:

建议虽然是简单的前置知识,还是打开略过一遍。

  • 浮点数与误差分析(少用除法)

  • 向量相关

向量

向量,就是带有方向和大小两个属性的边,通常形式为\(\overrightarrow{AB}=(a_1,a_2)=A\)。

运算与性质:

  • 判等:两点坐标重合。
il int dcmp(double a){
    if(a<-eps)	return -1;
    if(a>eps)	return 1;
    return 0;
}
il bool operator==(node a,node b)<% return !dcmp(a.x-b.x) && !dcmp(a.y-b.y); %>
  • 加减:\(A+B=(a_1,a_2)+(b_1,b_2)=(a_1+b_1,a_2+b_2)\)。
il node operator+(node a,node b)<% return node(a.x+b.x,a.y+b.y); %>
il node operator-(node a,node b)<% return node(a.x-b.x,a.y-b.y); %>
  • 模长:\(|A|=\sqrt{a_1^2+a_2^2}\)。
il double len(node a)<% return sqrt(dot(a,a)); %>
//dot是点乘函数
  • 角度:\(\tan \theta =\frac{a_2}{a_1},\theta =arctan \frac{a_2}{a_1}\)

  • 数乘:\(k\times A=k\times (a_1,a_2)=(ka_1,ka_2)\)。

il node operator*(node a,double k)<% return node(a.x*k,a.y*k); %>
  • 点乘:\(A\cdot B=(a_1,a_2)\cdot (b_1,b_2)=a_1b_1+a_2b_2\)。

(几何意义:\(A\) 乘上 \(B\) 在 \(A\) 上的投影,即\(|A|\times |B|\times cos \Theta\))

il double dot(node a,node b)<% return a.x*b.x+a.y*b.y; %>
  • 夹角:\(\cos \theta=\frac{A\cdot B}{|A|\times |B|}\)。
il double angle(node a,node b)<% return acos(dot(a,b)/len(a)/len(b)); %>
  • 若 \(A\cdot B=0\),(\(A,B\) 不为0)则 \(A\) 与 \(B\) 垂直,\(>0\) 为锐角,\(<0\) 为钝角。

  • 叉积:\(A\times B=\begin{vmatrix} a_1&b_1\\a_2&b_2 \end{vmatrix}=a_1b_2-b_1a_2=-B\times A\)。

(几何意义:叉积的绝对值=面积)

il double cro(node a,node b)<% return a.x*b.y-a.y*b.x; %>
  • 面积:\(|A\times B|=|A||B|\sin \theta\)。

  • 旋转:将 \(A\) 旋转 \(\alpha\) 弧度得到 \(A'\):

\(A=(a_1,a_2)=r(\cos\theta,\sin\theta);\)

\(A'=r(\cos(\theta+\alpha),\sin(\theta+\alpha)=r(\cos\theta \cos\alpha-\sin\theta \sin\alpha,\cos\theta \sin\alpha+sin\theta \cos\alpha)\)

\(=(a_1 \cos\alpha-a_2 \sin\alpha,a_1 \sin\alpha+a_2 \cos\alpha)\)

  • 直线与线段相关
直线与线段

直线一般形式有四:

\[ \begin{aligned} &ax+by+c=0\\ &y=kx+b\\ &两个端点\\ &一个起点和一个向量 \end{aligned} \]

其中,\(k\) 是直线的斜率,\(k=\frac{y_2-y_1}{x_2-x_1}=tan \alpha\),\(b\) 是直线的截距。

特别地,当两条直线垂直时有 \(k1\times k2=-1\)。

而线段,在代码中往往可以这样表示:

struct Node{double x,y;};
struct line{node p1,p2;};

有以下运算:

  • 判断点 \(P\) 是否在直线 \(AB\) 上。
il int judge_LINE(Node p,Node a,Node b)<% return !mystd::dcmp(Vector::cro(p-a,b-a)); %>
  • 判断点 \(P\) 是否在线段 \(AB\) 上。
il int judge_line(Node p,Node a,Node b)<% return !mystd::dcmp(Vector::cro(p-a,b-a)) && mystd::dcmp(mystd::fMin(a.x,b.x)-p.x)<=0 && mystd::dcmp(mystd::fMax(a.y,b.y)-p.y)<=0; %>
  • 求点 \(P\) 到直线 \(AB\) 的垂足。
il Node footnode(Node p,Node a,Node b){
		Node x=p-a,y=p-b,z=b-a;
		double len1=Vector::dot(x,z)/Vector::len(z),len2=-1.0*Vector::dot(y,z)/Vector::len(z);
		return a+z*(len1/(len1+len2));
	}

证明:见图。

  • 求点 \(P\) 到直线 \(AB\) 的对称点:
il Node symmetry(Node p,Node a,Node b)<% return p+(footnode(p,a,b)-p)*2; %>

叉积与跨立实验

我们在前置知识中已经提到叉积,但是叉积的什么“右手定则”我不会,长大再学(

上面提到,对于向量 \(A(x_1,y_1),B(x_2,y_2)\),有叉积:\(x_1y_2-x_2y_1\)。

(下有证明,别急)

以 \(p_0\) 为参考点,有代码:

叉积
double multi(node p1, node p2, node p0) {
    double x1, y1, x2, y2;
    x1 = p1.x - p0.x;
    y1 = p1.y - p0.y;
    x2 = p2.x - p0.x;
    y2 = p2.y - p0.y;
    return x1 * y2 - x2 * y1;
}

而该函数返回值若大于 \(0\),证明 \(p_2\) 在 \(p_1\) 逆时针方向,小于 \(0\) 则在顺时针方向,若等于 \(0\) 则共线。

为什么?我们现在来证明这个公式。

\[ \begin{aligned} x_1y_2-x_2y_1\\ &=(|A|\cos\theta_1)(|B|\sin\theta_2)-(|A|\sin\theta_1)(|B|\cos\theta_2)\\ &=|A||B|\cos\theta_1\sin\theta_2-|A||B|\sin\theta_1\cos\theta_2\\ &=|A||B|\sin(\theta_2-\theta_1)\\ &=-|A||B|\sin\theta \end{aligned} \]

所以,当 \(x_1y_2-x_2y_1>0\),意味着 \(\sin\theta<0\),就是 \(B\) 在 \(A\) 的逆时针方向。

标签:node,Node,cos,笔记,数学,il,几何,theta,sin
From: https://www.cnblogs.com/sonnety-v0cali0d-kksk/p/17613737.html

相关文章

  • C语言听课笔记
    %1f——double;%c——char;%p——&a;%s——char[]求两个数的较大值#include<stdio.h>int main(){ int num1=10; int num2=20; if (num1>num2)    printf("较大值是:%d\n",num1); else    printf("较大值是:%d\n",num2); return 0;}#include<stdio.h&......
  • 计算几何の板子
    一精度处理\(eps\)和\(sgn\)constdoubleeps=1e-8;intsgn(doublex){//判断大小if(fabs(x)<eps)return0;elsereturnx<0?-1:1;}二点1点的初始化向量的表示形式上与点完全相同重载点运算符,支持向量的四种运算structPoint{doublex,y;Poi......
  • 凸优化9——强对偶条件、几何解释、影子价格
    中科大-凸优化笔记(lec31)-Lagrange对偶(三)_及时行樂_的博客-CSDN博客中科大-凸优化笔记(lec32)-几种解释_及时行樂_的博客-CSDN博客关于Slater条件的证明有点难,我觉得暂时先记住就好此外我关注了一下影子价格这个东西什么是影子价格?——线性规划的对偶解,及拉格朗日乘数-知乎(......
  • PyTorch基础知识-新手笔记
    使用NumPy实现机器学习任务使用最原始的的NumPy实现一个有关回归的机器学习任务,不使用PyTorch中的包或类。代码可能会多一点,但每一步都是透明的,有利于理解每一步的工作原理。主要步骤如下:1)首先,给出一个数组x,然后基于表达式y=3x^2+2,加上一些噪声数据到达另一组数据。2)然后,构建......
  • 线段树合并学习笔记
    基本思路线段树合并其实就是简单的暴力合并就可以了。一般是运用于权值线段树。通常是在每个节点都需要要一颗线段树才能维护答案,且有多个节点时,会使用线段树合并。但每个节点所有的权值不能太多,如果都是比较满的二叉树的话,时间复杂度就会很高。通常,加入值的数量跟节点数量在同......
  • STC15 外部中断编程笔记
    以STC15W4K58S4为例,可以将片上的外部中断资源分为“高级”和“低级”两类,EXINT0和EXINT1属于高级的,EXINT2~EXINT4属于低级的。“高级”的外部中断可以配置中断优先级,选择中断源;低级的则不行。EXINT0和EXINT1的配置这两个外部中断的配置寄存器都可位寻址,因此可以直......
  • 复习笔记|《计算机组成原理》
    参考教材:《计算机组成原理》蒋本珊➢前2类题看书中和课件中的有关概念。➢第3、4、5类题请注意平时的作业。如:❑扩展操作码设计❑有效地址的计算❑定点数乘、除运算❑存储器设计❑Cache计算❑微指令操作控制字段的设计第一章➢存储程序概念计算机硬件的组成,存储器控......
  • [学习笔记] Switch语句使用“===”进行比较
    JS中,switch语句会使用恒等计算符(===)进行比较。如上所述,下列代码中因为x定义为字符串10,而case为数字10,因此将不会弹出“HelloWorld”:var x="10";switch(x){    case 10:alert("Hello");}实际应用时应注意这点。......
  • 【刷题笔记】9. Palindrome Number
    题目Determinewhetheranintegerisapalindrome.Aninteger is a palindromewhenit readsthesamebackwardasforward.Example1:Input:121Output:trueExample2:Input:-121Output:falseExplanation:Fromlefttoright,itreads-121.Fromrightto......
  • 《从0到1:JavaScript快速上手》笔记(一)
    一、两个十分有用的方法document.write():表示在页面输出一个内容alert():表示弹出一个对话框二、变量与常量在JavaScript中,变量指的是一个可以改变的量,也就是说,变量的值在程序运行过程中是可以改变的。(1)在JavaScript中,给一个变量命名,我们需要遵循以下2个方面的原则。变量有字母、......