计算几何入门之aizu两题 Projection Reflection

---恢复内容开始---

使用complex类来写计算几何。

第一题 传送门

题意给定一直线输入一个点求输入点到该直线射影交点的坐标:

=

p0到p2向量称为v2,p0到p1向量称为v1 易求得p0到t的向量为 (v2·v1)*(v1的方向向量) 。

用复数表示每个点和每个向量,则将v1*(v2的共轭复数)得到的实部就是x1*x2虚部就是y1*y2。

这样求得了p0到t的向量v3,所以ansx=xp0+xv3,ansy=yp0+yv3;

第二题  题意类似,做法相同。不再赘述。

现在贴第二题代码供参考

#include <iostream>
#include <cstdio>
#include <complex>
using namespace std;
typedef complex <double> Point;
typedef complex <double> Vector;
Point p1,p2,p3;
Vector v1,v2,v3,v4;
int main()
{
    double x1,y1,x2,y2;
    scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
    p1=Point(x1,y1);
    p2=Point(x2,y2);
    v1=Vector((x2-x1),(y2-y1));
    int n;
    scanf("%d",&n);
    while(n--){
        double a,b;
        scanf("%lf%lf",&a,&b);
        p3=Point(a,b);
        v2=Vector(a-x1,b-y1);
        v3=(conj(v1)*v2).real()*v1/norm(v1); //conj求共轭复数
        double ansx=v3.real()+x1,ansy=v3.imag()+y1;
        v4=Vector(2*(ansx-a),2*(ansy-b));
        double aansx=v4.real()+a,aansy=v4.imag()+b;
        printf("%.10lf %.10lf\n",aansx,aansy);
    }
    return 0;
}

---恢复内容结束---

时间: 03-10

计算几何入门之aizu两题 Projection Reflection的相关文章

hdu 1086(计算几何入门题——计算线段交点个数)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1086 You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7167    Accepted Submission(s): 3480 Problem Description Ma

(莫队算法)两题莫队算法统计数量的入门题

因为这两题差不多,而且比较简单,就放一起,做了这题,这种题目就是巨水的题了.随便写都行. CodeForces - 86D  Powerful array 题意: 多次查询数列中从L到R每个数字出现次数的平方乘这个数字的和. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <map> 6 #includ

第一部分:趣味算法入门;第八题:冒泡排序(并与选择排序对比)

100个不同类型的python语言趣味编程题 在求解的过程中培养编程兴趣,拓展编程思维,提高编程能力. 第一部分:趣味算法入门:第八题: 8.冒泡排序:对N个整数(数据由键盘输入)进行升序排序 冒泡排序的思想:首先从表头开始往后扫描数组,在扫描的过程中逐对比较相邻的俩个元素的大小.若相邻的两个元素中,前面的元素大于后面的元素,则将它们互换,称之为消去了一个逆序,在扫描的过程中不断的将两相邻元素中的大者往后移动,最后就将数组中的最大者换到了表的最后,然后在剩下的数组元素中(n-1)个元素重复上面的

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <

最近切的两题SCC的tarjan POJ1236 POJ2186

两题都是水题,1236第一问求缩点后入度为0的点数,第二问即至少添加多少条边使全图强连通,属于经典做法,具体可以看白书 POJ2186即求缩点后出度为0的那个唯一的点所包含的点数(即SCC里有多少点) //poj1236 #include<iostream> #include<cstdio> #include<string.h> #define maxn 6000 int now=0,next[maxn],head[maxn],point[maxn],num=0,dfn

codechef 两题

前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM,不过他求得是XOR最大值,原理类似.. B:KMP居然写搓了,后来一直改,题目放个链接好了:http://www.codechef.com/LTIME14/problems/TASHIFT. 我么可以对B字符串复制一下,然后再对A字符串求出NEXT数组,再匹配的过程中求出匹配最大长度时的位置, 刚开始我没想

计算几何入门向

这是一个计算几何入门的教程. 与计算几何密切相关的就是坐标系,坐标系上的点可以用下面数据结构实现. struct Point { double x,y; Point(int x,int y) :x(x),y(y){}; };typedef Point Vector; 向量也是经常需要的,由于和点所需储存的信息相同,可以直接定义为别名. 由于需要使用大量加减乘除,我们可以重载运算符达到很好的使用效果. /× 挖坑,有时间再写代码 ×/ 我们也可以用STL的虚数类来实现点和向量. typedef c

计算几何入门模板(持续更新)

我也算是刚入门计算几何吧,想写一篇入门的模板,让那些和我一样刚入门的人都能看懂就好. 首先要有一些理论知识,这可以百度,我就不多说了,通过百度,你要知道: ①叉积可以判断3个点共线,还可以判断2个点构成直线,第3个点在直线的左边还是右边. ②判断两条线段相交要有2个条件,一个是矩形的什么定理(名字太长,忘了)另一个就是4个点的叉积相乘小于0(也就是异号) 之后就可以看下我收集的简单的模板了. #include <map> #include <set> #include <li

[您有新的未分配科技点]计算几何入门(1):点,向量以及向量的简单应用

在打了一阵数据结构之后,老师表示"今天晚上让学长给你们讲一下计算几何"--然后就死了.jpg 昨天晚上一直在推数学的式子以及回顾讲课的笔记--计算几何特点就是多而杂,即使是入门部分也是如此-- 首先,我们从二维的几何问题开始处理. 我们知道,高中解析几何计算几何的基础是向量(Vector)和点(Point),所以我们先来表示这两个概念: 在计算几何中,点和向量一般用结构体来存储,像这样: 1 struct Point 2 { 3 double x,y,rad; 4 Point(doub