POJ1408 两条线段求交点+叉乘求几何面积+枚举
来源:互联网 发布:美国数据分析专业 编辑:程序博客网 时间:2024/09/21 09:21
POJ1408
1 求两条直线规范相交的交点坐标
如图,已知点A、B、C、D的坐标,求点P坐标:
其中,第一个式子不需要解释,记住这个定理即可。
第二个式子是由定比分点坐标公式推出。
(
Note①:
二维向量叉乘公式
a(x1,y1),b(x2,y2),则a×b=(x1y2-x2y1).
Note②:
定比分点坐标公式:
1 求两条直线规范相交的交点坐标
如图,已知点A、B、C、D的坐标,求点P坐标:
其中,第一个式子不需要解释,记住这个定理即可。
第二个式子是由定比分点坐标公式推出。
(
Note①:
二维向量叉乘公式
a(x1,y1),b(x2,y2),则a×b=(x1y2-x2y1).
Note②:
定比分点坐标公式:
已知四点如图所示,其中 , , ,,在两点连线上有一点P,设它的坐标 ,
且 ,可以求出P的坐标公式,如下:
将 带入并化简,可得
)
2
#include <iostream>#include <stdio.h>#include <math.h>//基本思想:因为题目要求对应边的对应点相连接,所以免去了很多不必要的情况,因而才可以算出所有交点,枚举得到的所有四边形,保留最大的一个。//关键:主要通过此题掌握,1 利用叉乘求两条规范相交直线的交点坐标 (由定比分点坐标公式和叉乘求三角形面积公式联立化简所得)(规范相交,两条直线只有一个非端点的交点,即该两条线段的四个端点分别处于交点两个方向的左右两侧) ,2 利用叉乘求多面性面积(通过三角形面积相加得到)//注意:叉乘得面积,面积是有正负的,向量ab叉乘向量ac(向量ab是a->b,向量ac是a->c),方向是根据右手定则从ab指向ac时大拇指所指的方向,向外是正,向内是负。using namespace std;struct point{ double x; double y;}point[35][35];double xx;double yy;double Area(struct point a,struct point b,struct point c){//利用ab叉乘ac return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);//向量ab,即箭头为a->b,时,用点b的坐标减去a的坐标}void Intersection(struct point line1_A,struct point line1_B,struct point line2_C,struct point line2_D){ double area1=Area(line1_A,line1_B,line2_D); double area2=Area(line1_A,line2_C,line1_B); xx=( area1*(line2_C.x)+area2*(line2_D.x) ) / ( area1+area2 ); yy=( area1*(line2_C.y)+area2*(line2_D.y) ) / ( area1+area2 ); return;}int main(){ int n; while(~scanf("%d",&n)&&n!=0){ ///Ini: point[0][0].x=0;point[0][0].y=0; point[n+1][n+1].x=1;point[n+1][n+1].y=1; point[0][n+1].x=0;point[0][n+1].y=1; point[n+1][0].x=1;point[n+1][0].y=0; for(int i=1;i<=n;i++){ scanf("%lf",&point[i][0].x); point[i][0].y=0; } for(int i=1;i<=n;i++){ scanf("%lf",&point[i][n+1].x); point[i][n+1].y=1; } for(int i=1;i<=n;i++){ scanf("%lf",&point[0][i].y); point[0][i].x=0; } for(int i=1;i<=n;i++){ scanf("%lf",&point[n+1][i].y); point[n+1][i].x=1; } ///Intersection: for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ Intersection(point[i][0],point[i][n+1],point[0][j],point[n+1][j]); point[i][j].x=xx; point[i][j].y=yy; //cout<<xx<<" "<<yy<<endl; } } ///Enumerate: double maxx=0; double temp; for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ temp=Area(point[i][j],point[i+1][j],point[i][j+1]); temp+=Area(point[i+1][j+1],point[i][j+1],point[i+1][j]); temp/=2;//因为四边形不一定是正方形,所以用叉乘分别算出(上三角的面积*2)和(下三角的面积*2)相加之后再/2,即可。 if(temp>maxx){ maxx=temp; } } } ///printf: printf("%.6f\n",maxx); }}
0 0
- POJ1408 两条线段求交点+叉乘求几何面积+枚举
- 两条线段求交点编程
- 求两线段交点
- 判断两条线段/直线相交,并求交点
- 判断两条线段/直线相交,并求交点
- UVa11437 - Triangle Fun(两线段的交点求法、叉乘求面积)
- poj1408--Fishnet(求多边形面积)
- poj 1408 Fishnet(计算几何 叉积求面积 求两直线交点 暴力)
- 计算几何 点线的综合题, 精度+ 线段相交+ 求交点 + 求面积 poj 2826 An Easy Problem?! (推荐)
- java计算两条线段交点
- 求两线段的交点(C++)
- poj 1269(求两线段交点)
- 判断两线段是否相交求交点
- 判断两线段相交,并求交点
- 计算几何之线段性质(二):求线段交点
- POJ1408-Fishnet(线段求交)
- hdu 1086 计算几何 求线段有多少个交点
- poj 1127 计算几何入门题 求线段交点
- 利用RxJAVA实现加载网络图片的方法
- VS2013 如何引用本地的DLL
- Android 日常笔记
- c++中的Queue List
- 真正的教育是建立共鸣,而不是教他怎么做
- POJ1408 两条线段求交点+叉乘求几何面积+枚举
- JSP中传后台中文参数乱码解决办法
- 采用@Aspect进行拦截操作
- 海量数据处理常用思路和方法
- ionic之使用webStorm提交github
- 不同人对BUG的反应,程序员:谁动了我的代码?
- angularjs的$watch、$watchGroup、$watchCollection的区别
- MyBatis学习总结(三)——优化MyBatis配置文件中的配置
- Jquery常用的方法