eddy1021
#include <utility> // include pair //typedef std::pair<int,int> Pt; typedef std::pair<double,double> Pt; #define X first #define Y second Pt point( double x , double y ){ return make_pair( x , y ); } int main(){ Pt a = point( 4 , 3 ); printf( "%d %d\n" , a.X , a.Y ); }
內積(Dot): $A \cdot B = |A| |B| cos \theta $ $A \cdot B = A_x B_x + A_y B_y$ 外積(cross): $A \times B = |A| |B| sin \theta $ $A \times B = A_x B_y - A_y B_x$
typedef std::pair<double,double> Pt; #define X first #define Y second Pt operator+( const Pt& p1 , const Pt& p2 ){ return Pt( p1.X + p2.X , p1.Y + p2.Y ); } Pt operator-( const Pt& p1 , const Pt& p2 ){ return Pt( p1.X - p2.X , p1.Y - p2.Y ); } double operator*( const Pt& p1 , const Pt& p2 ){ return p1.X * p2.X + p1.Y * p2.Y; } double operator^( const Pt& p1 , const Pt& p2 ){ return p1.X * p2.Y - p1.Y * p2.X; }
Pt operator*( const Pt& p1 , const double& k ){ return Pt( p1.X * k , p1.Y * k ); } Pt operator/( const Pt& p1 , const double& k ){ return Pt( p1.X / k , p1.Y / k ); } double abs( const Pt& p1 ){ return sqrt( p1 * p1 ); }
兩向量可夾出三角形 其面積可由外積得出: $\Delta OAB = \frac{1}{2} \vec{A} \times \vec{B}$ 此面積我們稱爲$\textbf{有向面積}$ (外積有正有負)
$\vec{AB} \times \vec{AC}$ $=(5,0) \times (3,4)$ $= 5 \times 4 - 0 \times 3$ $=20 > 0$
$\vec{AC} \times \vec{AB}$ $=(3,4) \times (5,0)$ $= 3 \times 0 - 4 \times 5$ $= -20 < 0$
如同三角形 多邊形的有向面積: $\textbf{ 逆時針爲正}$ $\textbf{ 順時針爲負}$
任意在平面上選一點 $A$ 將所有點與 $A$ 點連線 相鄰兩點將與 $A$ 點形成三角形 依逆時針(或順時針)序依序加總各三角形有向面積 即爲該多邊形之有向面積
一般而言,會挑選原點作爲參考點 若一個多邊形的頂點依序爲: $P_0,P_1,\ldots,P_{N-1},P_N=P_0$ 則多邊形的有向面積公式爲: $\text{Area}=\frac{1}{2} \sum\limits_{i=0}^{N-1} \vec{P_i} \times \vec{P_{i+1}}$
int ori( const Pt& o , const Pt& a , const Pt& b ){ double cross = ( a - o ) ^ ( b - o ); if( fabs( cross ) < eps ) return 0; return cross > 0 ? 1 : -1; }
puts( 0.1 + 0.2 == 0.3 ? "equal" : "not equal" );形態 大小 精度 float 4 B $10^{-7}$ double 8 B $10^{-16}$ long double 10 B $10^{-19}$
bool equal( const double& a , const double& b ){ return b - eps < a && a < b + eps; } bool less( const double& a , const double& b ){ return a < b - eps; } bool lessOrEqual( const double& a , const double& b ){ return a < b + eps; }
$\pi=3.14159265358979...=180^{\circ}$
$cos(x)=\frac{b}{c}$ $sin(x)=\frac{a}{c}$ $tan(x)=\frac{a}{b}$
$cos(\theta)=\frac{x}{r}$ $sin(\theta)=\frac{y}{r}$ $tan(\theta)=\frac{y}{x}$ $atan2(y,x)=\theta$
Pt o; D angle( const Pt& x ){ return atan2( x.Y , x.X ); } bool cmp( Pt a , Pt b ){ return angle( a - o ) < angle( b - o ); }
Pt o; bool cmp( Pt a , Pt b ){ return ( a - o ) ^ ( b - o ) > 0; }
平面上 $N$ 個點,問一條直線最多通過幾個點
$O(N^3) \Rightarrow O(N^2\lg N)$