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)$