グラフィックスコンピューティング・数学・ノート(随時更新)。。。

// hdu1086するセグメントの交点数nを見つけます。

// http://acm.hdu.edu.cn/showproblem.php?pid=1086

//以下は翻訳された先端であります:

// もしN(1 <= N <= 100) のセグメント(セグメント)、出力すべての交点の数。M(Mは> 2)の線分が同じ点で交差する場合、計算が繰り返されるべきです。
//次の2つのセグメントが複数の交差しないと仮定することができます。(重複しません)

//非常に一般的なソリューション:各2つの線分を介しが交差するかどうかを決定します。

2つの連立:// 2行がアプローチを交差するかどうかを判断します。交点座標を求めます。

//高校の知識、直接導出することができ、覚えていません。

//線形方程式の一般式:(Y2 - Y1)* X +(X1 - X2)*のY +(×2 *のY1 - ×1 *のY2)= 0;元の式(A * X +のB * Y + C = 0)

/(A1の* B2の - A2 * B1)、Y - (B2 * C1 B1 * C2)://交差点は、x座標(A2の* C1の - A1 * C2)/(A1の* B2の - A2 * B1)を、

//のA1 * B2の場合 - A2 * B1 == 0は交差点が存在しないことを示している(平行)

1の#include <cstdioを>
 2  
3  構造体のライン{
 4      ダブルX1、Y1、X2、Y2。
5 }行[ 105 ]。
6  
7  INT N。
8  
9は、 BOOL(交差INT L1、INT {L2)
 10      の二重 - [L1] .y2 A1 =行; .y1ライン[L1]
11      二重 B1 =行[L1] .x1 - ライン[L1] .x2。
12      二重 C1 =行[L1] .x2の*ライン[L1] .y1 -ライン[L1] .x1 * ライン[L1] .y2。
13      二重 A2 =行[L2] .y2 - ライン[L2] .y1。
14      二重 B2 =行[L2] .x1 - ライン[L2] .x2。
15      二重 C2 =行[L2] .x2の*ライン[L2] .y1 -ライン[L2] .x1 * ライン[L2] .y2。
16      もし(A1の* b2を- A2 * B1 == 0を返す 17      二重 X =(B1の* C2の- B2 * C1)/(A1の* B2の- A2 * B1)。
18      二重 Y =(A2の* C1の- A1 * C2)/(A1の* B2の- A2 * B1)。
19      であれば((X> =ライン[L1] .x1 && X <=行[L1] .x2 || X <=行[L1] .x1 && X> = ライン[L1] .x2)
 20      &&(X> =行[L2] .x1 && X <=行[L2] .x2 || X <=行[L2] .x1 && X> =ライン[L2]。 21      リターン はfalse ;
22  }
 23  
24  INT メイン(){
 25      ながら(scanf関数(" %のD "、&​​N)== 1 && N){
 26          のためのint型 I = 0を!; I = N; ++ i)が{
 27              のscanf(" %LF%LF%LF%LF 、およびライン[I] .x1、&ライン[I] .y1、&ライン[I] .x2、&ライン[I] .y2)。
28          }
 29          INT ANS = 0 30          のためのint型 I =0 ; I = N!1++ I){
 31              のためのint型 J = I + 1 ;!; J = N ++ J){
 32                  場合)++ ANS(交差(I、J) 33              }
 34          }
 35          のprintf(" %d個の\ n " 、ANS)。
36      }
 37      リターン 0 38 }

 

おすすめ

転載: www.cnblogs.com/pupil-xj/p/11584065.html