参考博客:

用向量积求线段焦点证明:

首先,我们设 (AD向量 × AC向量) 为 multi(ADC) ; 那么 S三角形ADC = multi(ADC)/2 。

由三角形DPD1 与 三角形CPC1 相似;可得 |DP| / |PC| = |DD1| / |CC1| = multi(ADB) × multi(ACB) 。

|DP| / |PC| = (xD - xP) / (xP - xC) = (yD - yP) / (yP - yC) 。

xP = ((multi(D,B,A) * xC - multi(C,B,A) * xD)) / (multi(D,B,A) - multi(C,B,A));

yP = ((multi(D,B,A) * yC - multi(C,B,A) * yD)) / (multi(D,B,A) - multi(C,B,A));

题目不难,大致题意为:

给定一个单位矩阵,并在每条边上面“嵌入”n个点,这样每条边共有n+2个点。将单位矩阵对面相应位置的点连接起来,构成n*n个不规则四边形。要求出这n*n个矩阵中面积的最大值。

简单的模拟+叉积求三角形面积+不规则四边形划分成三角形求面积。

枚举每个四边形,将每个四边形划分为2个三角形。利用三角形求面积公式计算面积。比较求出最大面积。

那么关键点在于如何求三角形面积。

下面提供2中方法:

1)解析几何:

海伦公式: S=p*(p-a)*(p-b)*(p-c)取根号,其中p=(a+b+c)/2;

2)计算几何方法

S=1/2*| ac向量 叉乘 ab向量|

显然,计算几何方法更快,且精度更高(没有根号),代码也少,而且在求线段交点的过程中也会用到叉乘。一举两得

另外在模拟的过程中,要格外小心,因为很多细节要注意。
代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
using namespace std;
const int max_=;
typedef struct point{
double x;
double y;
}point;
point node[max_][max_];
double det(double x1,double y1,double x2,double y2)
{
return x1*y2-x2*y1;
}
double cross(point A,point B,point P)//AB,AP的叉乘
{
return det(B.x-A.x,B.y-A.y,P.x-A.x,P.y-A.y);
}
void intersection(point A,point B,point C,point D,int i,int j)//两线段的交点坐标
{
double nulti1=cross(A,B,C);
double nulti2=cross(A,B,D);
//printf("%lfok\n",nulti1);
node[i][j].x=(nulti2*C.x-nulti1*D.x)/(nulti2-nulti1);
node[i][j].y=(nulti2*C.y-nulti1*D.y)/(nulti2-nulti1);
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
node[][].x=0.0,node[][].y=1.0;
node[][n+].x=1.0,node[][n+].y=1.0;
node[n+][].x=0.0,node[n+][].y=0.0;
node[n+][n+].x=1.0,node[n+][n+].y=0.0;
for(int i=;i<=n+;i++)
{
scanf("%lf",&node[n+][i].x);
node[n+][i].y=0.0;
}
for(int i=;i<=n+;i++)
{
scanf("%lf",&node[][i].x);
node[][i].y=1.0;
}
for(int i=n+;i>=;i--)
{
scanf("%lf",&node[i][].y);
node[i][].x=0.0;
}
for(int i=n+;i>=;i--)
{
scanf("%lf",&node[i][n+].y);
node[i][n+].x=1.0;
}
for(int i=;i<=n+;i++)
for(int j=;j<=n+;j++)
{
intersection(node[i][],node[i][n+],node[][j],node[n+][j],i,j);
}
double maxm=-1.0;
for(int i=;i<=n+;i++)
for(int j=;j<=n+;j++)//两三角形面积和
{
double temp=fabs(cross(node[i][j],node[i+][j],node[i][j+]))*0.5+
fabs(cross(node[i+][j+],node[i+][j],node[i][j+]))*0.5;
if(maxm<temp)
maxm=temp;
// printf("ok\n");
}
printf("%.6lf\n",maxm);
/* for(int i=2;i<=n+1;i++){
for(int j=2;j<=n+1;j++)
printf("%lf ",node[i][j].x);
printf("\n");
}*/
}
}

几何问题 poj 1408的更多相关文章

  1. POJ 1408 Fishnet【枚举+线段相交+叉积求面积】

    题目: http://poj.org/problem?id=1408 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...

  2. 简单几何(凸包) POJ 1696 Space Ant

    题目传送门 题意:一个蚂蚁一直往左边走,问最多能走多少步,且输出路径 分析:就是凸包的变形题,凸包性质,所有点都能走.从左下角开始走,不停排序.有点纠结,自己的凸包不能AC.待理解透凸包再来写.. 好 ...

  3. 简单几何(凸包) POJ 1113 Wall

    题目传送门 题意:求最短路线,使得线上任意一点离城堡至少L距离 分析:先求凸包,答案 = 凸包的长度 + 以L为半径的圆的周长 /*********************************** ...

  4. 简单几何(凸包) POJ 2187 Beauty Contest

    题目传送门 题意:求两点的距离平方的最大值 分析:凸包模板题 /************************************************ * Author :Running_T ...

  5. Fishnet(暴力POJ 1408)

    Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1911   Accepted: 1227 Descripti ...

  6. 两条线段求交点+叉积求面积 poj 1408

    题目链接:https://vjudge.net/problem/POJ-1408 题目是叫我们求出所有四边形里最大的那个的面积. 思路:因为这里只给了我们正方形四条边上的点,所以我们要先计算横竖线段两 ...

  7. POJ 1408:Fishnet

    Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1921   Accepted: 1234 Descripti ...

  8. poj很好很有层次感(转)

    OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...

  9. POJ题目分类推荐 (很好很有层次感)

    著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299 ...

随机推荐

  1. python中使用动态库

    首先,创建一个简单的动态库编程生成dll.so:   gcc -fPIC -O2 -shared dll.c -o dll.soC文件:dll.c  如下 #include <stdio.h&g ...

  2. tushare积分怎么获得 tushare pro 积分充值 积分转让

    本人是做量化投资的,团队转型,换了交易策略,手头有多个离职同事的闲置转让.600分:原价50元,仅需39元1500分:原价150元,仅需109元(售罄)2000分:原价200元,仅需149元5000分 ...

  3. [BJWC2018]上学路线

    Description 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路口.小B ...

  4. 【java】记录一下java的常用用法

    1.二维数组 public static void main(String[] args) { //定义 int a[][] = {{1,2,3},{4,5,6},{7,8,9}}; int [][] ...

  5. CSS3 新特性(box-sizing盒模型,背景线性渐变,filter滤镜,calc函数,transition过渡)

    1.盒子模型(box-sizing) CSS3 中可以通过 box-sizing 来指定盒模型,有两个值:即可指定为 content-box.border-box,这样我们计算盒子大小的方式就发生了改 ...

  6. teb教程3

    配置和运行机器人导航 简介:配置teb_local_planner作为navigation中local planner的插件 参考teb安装 由于局部代价地图的大小和分辨率对优化性能影响很大,因为占据 ...

  7. hbuilder 配置app为沉浸式状态栏

  8. sping+quartz定时任务的最简单实践

    1,启动spring容器 Tomcat启动的时候,加载web.xml的listener和context-param,spring的listener监听到对应的contextConfigLocation ...

  9. apue.h报错问题

    下载apue.3e后进入make,提示错误如下: collect2: error: exit status Makefile:: recipe for target 'badexit2' failed ...

  10. javascript实现获取指定精度的上传文件的大小简单实例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...