Geometric Shapes - POJ 3449(多邊形相交)

題目大意:給一些幾何圖形的編號,求出來這些圖形都和那些相交。
?
分析:輸入的正方形對角線上的兩個點,所以需要求出來另外兩個點,公式是:
x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3+x1-x3)/2;
x4:=(x1+x3-y3+y1)/2; y4:=(y1+y3-x1+x3)/2;
這個是可以推倒出來的,有興趣的可以推一下,給的矩形三個點,是按照順序給的,求出來第四個點即可,比較容易求,x4=x1-x2+x3, y4=y1-y2+y3
別的圖形的點也都是按照順序給的,兩個圖形如果相交一定是邊的相交,一個圖形把另一個包含不算相交。所以處理完輸入輸出,還是比較容易做的。
?
代碼如下:
========================================================================================================================
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;const int MAXN = 26;
const double EPS = 1e-8;int Sign(double t)
{if(t > EPS)return 1;if(fabs(t) < EPS)return 0;return -1;
}
struct Point
{double x, y;Point(double x=0, double y=0):x(x),y(y){}Point operator - (const Point &tmp)const{return Point(x-tmp.x, y-tmp.y);}double operator ^(const Point &tmp)const{return x*tmp.y - y*tmp.x;}
};
struct Segment
{Point S, E;Segment(Point S=0, Point E=0):S(S), E(E){}bool Intersect(const Segment &tmp)const{int t1 = Sign((S-E)^(tmp.S-E));int t2 = Sign((S-E)^(tmp.E-E));return abs(t1+t2) != 2;}
};
struct Shapes
{Segment sg[MAXN];int N;
};
bool Find(int u, int v, Shapes a[])
{for(int i=0; i<a[u].N; i++)for(int j=0; j<a[v].N; j++){if(a[u].sg[i].Intersect(a[v].sg[j]) && a[v].sg[j].Intersect(a[u].sg[i]))return true;}return false;
}
void Link(Shapes a[], int k, Point p[])
{int i, N=a[k].N;p[N] = p[0];for(i=1; i<=N; i++)a[k].sg[i-1] = Segment(p[i-1], p[i]);
}
int main()
{char Id[MAXN], s[MAXN], s1[MAXN], s2[MAXN];Shapes a[MAXN];Point p[MAXN];memset(a, 0, sizeof(a));while(scanf("%s", Id) != EOF && Id[0] != '.'){if(Id[0] == '-'){for(int i=0; i<MAXN; i++){if(a[i].N){///如果這個符號的形狀存在int ans[MAXN], k=0;for(int j=0; j<MAXN; j++){if(!a[j].N || i==j)continue;if(Find(i, j, a) == true)ans[k++] = j;}if(k == 1)printf("%c intersects with %c\n", i+'A', ans[0]+'A');else if(k == 0)printf("%c has no intersections\n", i+'A');else{printf("%c intersects with %c", i+'A', ans[0]+'A');for(int t=1; t<k-1; t++)printf(", %c", ans[t]+'A');if(k == 2)printf(" and %c\n", ans[k-1]+'A');elseprintf(", and %c\n", ans[k-1]+'A');}}}printf("\n");memset(a, 0, sizeof(a));}else{scanf("%s", s);int k = Id[0] - 'A';if(strcmp(s, "square") == 0){///正方形a[k].N = 4;scanf("%s%s", s1, s2);sscanf(s1, "(%lf,%lf)", &p[0].x, &p[0].y);sscanf(s2, "(%lf,%lf)", &p[2].x, &p[2].y);p[1].x = (p[0].x+p[2].x + p[2].y-p[0].y)/2;p[1].y = (p[0].x-p[2].x + p[0].y+p[2].y)/2;p[3].x = (p[0].x+p[2].x + p[0].y-p[2].y)/2;p[3].y = (p[2].x-p[0].x + p[0].y+p[2].y)/2;}else if(strcmp(s, "line") == 0){///直線a[k].N = 2;scanf("%s%s", s1, s2);sscanf(s1, "(%lf,%lf)", &p[0].x, &p[0].y);sscanf(s2, "(%lf,%lf)", &p[1].x, &p[1].y);}else if(strcmp(s, "rectangle") == 0){///長方形a[k].N = 4;for(int t=0; t<3; t++){scanf("%s", s1);sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);}p[3].x = p[0].x-p[1].x+p[2].x;p[3].y = p[0].y-p[1].y+p[2].y;}else if(strcmp(s, "triangle") == 0){///三角形a[k].N = 3;for(int t=0; t<3; t++){scanf("%s", s1);sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);}}else if(strcmp(s, "polygon") == 0){///多邊形scanf("%d", &a[k].N);for(int t=0; t<a[k].N; t++){scanf("%s", s1);sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);}}Link(a, k, p);}}return 0;
}

?

轉載于:https://www.cnblogs.com/liuxin13/p/4797478.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458900.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

更新10_linux,時隔十年,QQ更新了Linux版本

昨天1024程序員節&#xff0c;QQ悄悄地更新了QQ for Linux&#xff0c;也許是給各位一個驚喜吧。官網及其的簡陋。和一個Word文檔似的。十年一更&#xff0c;有網友稱&#xff0c;瞬間回到QQ2006&#xff0c;確實界面功能有些落后&#xff0c;相信QQ可以跟上潮流的&#xff0c;…

[滲透測試]掃目錄,Sqlmap利用均超時,利用dirb掃描

今天碰到一個網友傳來的Webshell地址&#xff0c;問我對方如何取得webshell。 網站為阿里云服務器&#xff0c;存在明顯的注入漏洞&#xff0c;但是任何語句都會令網頁報錯&#xff0c;sqlmap一直超時&#xff0c;御劍掃描目錄1個線程也會導致被屏蔽IP。 經一學長提點&#xff…

x = x+1,x+=1,x++那個的執行效率高

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** x x1的效率最低 1&#xff09;讀取右邊x的地址 2&#xff09;執行x13&#xff09;讀…

修正線性單元(Rectified linear unit,ReLU)

修正線性單元&#xff08;Rectified linear unit&#xff0c;ReLU&#xff09; Rectified linear unit 在神經網絡中&#xff0c;常用到的激活函數有sigmoid函數f(x)11exp(?x)、雙曲正切函數f(x)tanh(x)&#xff0c;今天要說的是另外一種activation function&#xff0c;recti…

C語言綜合期末作業,內蒙古農業大學2010年期末c語言綜合作業.doc

內蒙古農業大學2010年期末c語言綜合作業綜合練習作業#includeint main(void){int choice,i;void shuai();void ge();void wang();void bing();for(i1;i<5;i){printf("[1]統計字符個數\n");printf("[2]判斷素數\n");printf("[3]求斐波那契數列\n&qu…

鏈表創建、逆置、刪除詳解

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 對鏈表的理解&#xff1a;http://www.nowamagic.net/librarys/veda/detail/2220 #inc…

python與shell的3種交互方式介紹

【目錄】 1.os.system(cmd) 2.os.popen(cmd) 3.利用subprocess模塊 4.subprocessor模塊進階 【概述】 考慮這樣一個問題&#xff0c;有hello.py腳本&#xff0c;輸出”hello, world!”&#xff1b;有testinput.py腳本&#xff0c;等待用戶輸入&#xff0c;然后打印用戶輸入的數…

C語言里if語句變量作為判斷條件,C語言教學(九-上)if else判斷語句

原標題&#xff1a;C語言教學(九-上)if else判斷語句今天講if else判斷語句&#xff0c;簡單理解就是進行條件判斷&#xff0c;如果條件達到則執行if 里或else里的語句。先來看if。if的寫法和for差不多,就是不用括號里的兩個分號&#xff0c;if (條件) { }&#xff0c;if加括號…

const修飾指針和引用的用法【轉貼】

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** const修飾的指針會額外的占內存嗎&#xff1f; 仍然是4&#xff0c;不會占額外的…

調整linux系統時區

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 好吧&#xff0c;使用tzselect又靠譜些&#xff0c;使用前把/etc/localtime刪除了。 執行上前那個告訴我文件重新了&#xff0c;所以就沒有搞了轉載于:https://www.cnblogs.com/hark0623/p/4807426.html

stm32c語言設計以及注釋,13個基于STM32的經典項目設計實例,全套資料~-嵌入式系統-與非網...

STM32單片機現已火遍大江南北&#xff0c;各種教程資料也是遍布各大網站論壇&#xff0c;可謂一抓一大把&#xff0c;但大部分都差不多。今天總結了幾篇電路城上關于STM32 的制作&#xff0c;不能說每篇都是經典&#xff0c;但都是在其他地方找不到的&#xff0c;很有學習參考意…

memcpy,strcpy,strncpy

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** memcpy c和c使用的內存拷貝函數.從源src所指的內存地址的起始位置開始拷貝n個字節…

二維數組聯通子數組和最大

題目要求&#xff1a; 返回一個二維整數數組中最大聯通子數組的和。輸入一個二維整形數組&#xff0c;數組里有正數也有負數。文件輸出。思路:和之前的動態規劃相識&#xff0c;把二維數組轉換為一維數組&#xff0c;先求每一個列的子數組和最大&#xff0c;最后在用正數就加&a…

c語言如何給變量加鎖,C語言互斥鎖-條件變量實現公共緩存區數據讀寫

#include char buffer[128];int has_data0;pthread_mutex_t mutex;pthread_cond_t cond;pthread_cond_t cond2;void read_buf(void){do{pthread_mutex_lock(&mutex);//鎖定互斥鎖if(has_data0){/*阻塞線程,等待另外一個線程發送信號&#xff0c;同時為公共數據區解鎖*/pthr…

view-activity跟控件在onkey事件上的傳遞關系

android 中Activity跟View對于鍵盤的監聽&#xff0c;主要有以下幾個方法 //按鍵按下 public boolean onKeyDown(int keyCode, KeyEvent event) {} //按鍵彈起 public boolean onKeyUp(int keyCode, KeyEvent event) {} //常按 public boolean onKeyLongPress(int keyCode, Ke…

PMP考試的過與不過

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 我在一年多時間里參加了三次PMP考試&#xff0c;前兩次都失敗&#xff0c;直到第三次才…

JPA一對多循環引用的解決

說是解決&#xff0c;其實不是很完美的解決的&#xff0c;寫出來只是想記錄一下這個問題或者看一下有沒有哪位仁兄會的&#xff0c;能否知道一二。 下面說說出現問題&#xff1a; 問題是這樣的&#xff0c;當我查詢一個一對多的實體的時候&#xff0c;工具直接就爆了&#xff0…

太原理工大學c語言課程設計報告,[太原理工大學C語言實驗報告.doc

[太原理工大學C語言實驗報告本科實驗報告課程名稱&#xff1a; 程序設計技術B實驗項目&#xff1a;實驗地點&#xff1a; 明向校區軟件學院機房專業班級&#xff1a; 學號&#xff1a;學生姓名&#xff1a;指導教師&#xff1a; 呼克佑2014年 12月 日實驗名稱 實驗一 C語言的運…

網頁常用動態效果--懸浮廣告

關鍵在于動態獲取滾動坐標值 測試滾動事件 $(window).scroll(function(){ console.log($(window).scrolltop()); }) 獲取三個高度&#xff1a;窗口高度&#xff0c;盒子高度以及滾動坐標值&#xff0c;將廣告盒子設置為絕對定位&#xff0c;當鼠標滾動時&#xff0c;其top值為滾…

打印英文年歷C語言函數,C語言打印年歷

voidshow_year(int year){inti,j,k,t,n;                           // 用來輔助計數int table[24][21] {0};                     // 年歷數組int month_day[12] {31,28,31,30,31,30,31,31,30,31,30,31}; // 每月上限天數i…