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