今天的課程中,學習了c++的vector,指標,深複製與淺複製,字串幾個內容,上機作業為:
在之前編寫的point類等的基礎上,編寫函式bool isconvex(const vector非常簡單的一段**,但是在上手之前並不知道該如何判斷是否是乙個凹多邊形,經過查詢資料,發現可以通過使用叉乘的方式進行判斷。&points),判斷輸入的點陣列是否是凸多邊形,若是返回true,否則返回false。在主函式中輸入點的座標。
主要思路為:通過順時針進行對點的輸入,檢測多邊形上是否有凹點,如果沒有則為凸多邊形。
其原理是,凸多邊形的每個頂點的轉向都應該一致,不一致的點 就是凹點。
再來複習一下叉乘:
p1(x1,y1) p2(x2,y2) p3(x3,y3) l1=(x1-x3,y1-y3) l2=(x2-x3,y2-y3) 公式:s=(x1-x3)(y2-y3)-(x2-x3)(y1-y3) 當s>0時,p1,p2,p3三個點呈逆時針編寫過程中,考慮到很多情況下輸入的時候並沒有考慮是順時針輸入還是逆時針輸入,輸入的角度可能是外角也可能是內角,因此從單獨乙個角進行判斷並不方便,所以我根據相鄰兩個角的角度是否乙個發生突變進行判斷當s<0時,p1,p2,p3三個點呈順時針
#pragma once
#pragma once
#include
#include
using
namespace std;
class
point
point
(point& np)
;double
getx()
double
gety()
void
setx
(double nx)
void
sety
(double ny)
~point()
//析構
bool
isconvex
(const vector
& points,
int number)
;private
:double x, y;
};
#include
#include
"point.h"
#include
point::
point
(point& p)
bool point::
isconvex
(const vector
& points,
int number)
//額外處理最後兩個角度的叉乘
crossproduct =
(points[number-2]
.x - points[0]
.x)*
(points[number-1]
.y - points[0]
.y)-
(points[number-1]
.x - points[0]
.x)*
(points[number-2]
.y - points[0]
.y);
arr[number-2]
= crossproduct;
crossproduct =
(points[number -1]
.x - points[1]
.x)*
(points[0]
.y - points[1]
.y)-
(points[0]
.x - points[1]
.x)*
(points[number -1]
.y - points[1]
.y);
arr[number -1]
= crossproduct;
//若相鄰三邊之間角度發生改變,則為凹多邊形
for(
int i =
0; i < number -
2; i++
)return
true
;}
新增鏈結描述#include
#include
#include
"point.h"
using
namespace std;
intmain()
if(points[0]
.isconvex
(points, n)
)else
}
新增鏈結描述
判斷乙個多邊形是否是凸多邊形
乙個很簡單的問題看了好久,但就是提交不過,也看不出是哪齣了問題 問題為 判斷乙個多邊形是否是凸多邊形 我的思路是這樣的 建立x,y這兩個陣列用來存放座標,計算兩個向量,然後讓計算它們的叉積,如果叉積小於零,說明後乙個向量在前乙個向量的右側,即順時針方向,只要有乙個是這樣的情況,則不符合條件。然後就是...
驗證多邊形是否為凸多邊形
驗證多邊形是否為凸多邊形 2108 shape of hdu include define debug 0 int crossmulti int x0,int y0,int x1,int y1,int x2,int y2 int main int n,i int f x,f y 第1個點 int s...
判斷乙個點是否在多邊形中
例項 1 圖 1是乙個典型的14邊形,紅點為測試點,判斷該紅點是否在14邊形中。解決方法 穿過紅點,做一條平行於x軸的水平線,於14邊形共有8個交點,如果,在紅點的左右兩邊各有奇數個交點,那麼在多邊形中 如果,左右兩邊各有偶數個交點,那麼不在多邊形中 圖 2 例項 2 多邊形是交叉的且封閉的。如圖二...