题目大意:有一个正N边形,然后给出两个点,求出剩余的点的坐标。

分析:向量旋转可以求出坐标,顺时针旋转时候,x = x'*cos(a) + y'*sin(a), y=-x'*sin(a) + y'*cos(a), 逆时针时候 x = x'*cos(a)-y'*sin(a), y=x'*sin(a)+y'*cos(a)。题目中先求出来圆心,然后再求剩余的点,不过求圆心的时候一定注意判断一下两点的角度是否大于PI。

代码如下:

==========================================================================================================

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std; const int MAXN = ;
const double PI = acos(-1.0);
const double EPS = 1e-; struct point
{
double x, y;
point(double x=, double y=):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.x+y*tmp.y;
}
};
double Dis(point a, point b)
{
return sqrt((a-b)*(a-b));
}
struct segment
{
point s, e;
segment(point s=, point e=):s(s),e(e){} point Turn(double len, double a)
{///线段绕点s旋转a角度后长len的坐标,顺时针
point t = e-s, ans;
double len1 = Dis(s, e);
/// printf("sin(a)=%lf, cos(a)=%lf\n", sin(a), cos(a));
ans.x = s.x + (t.y*sin(a)+t.x*cos(a))*len/len1;
ans.y = s.y + (-t.x*sin(a)+t.y*cos(a))*len/len1; return ans;
}
}; int main()
{
point p[MAXN];
int N, A, B;
scanf("%d%d%d", &N, &A, &B);
A-= , B-=;
scanf("%lf%lf%lf%lf", &p[A].x, &p[A].y, &p[B].x, &p[B].y); if(A > B)swap(A, B); double a, b, R;
segment L; if(B-A >= N/)
{///夹角大于PI
a = PI * / N;
b = PI/ - a * (N-(B-A)) / ;
L.s = p[B], L.e = p[A];
}
else
{
a = PI * / N;
b = PI/ - a * (B-A) / ;
L.s = p[A], L.e = p[B];
} R = Dis(L.s, L.e) / / cos(b);
point heart = L.Turn(R, b); L.s = heart; for(int i=; i<N; i++)
{
L.e = p[(A+i)%N];
p[(A+i+)%N] = L.Turn(R, a);
} for(int i=; i<N; i++)
{
if(fabs(p[i].x) <= EPS)p[i].x = EPS;
if(fabs(p[i].y) <= EPS)p[i].y = EPS;
printf("%.6f %.6f\n", p[i].x+1e-, p[i].y+1e-);
} return ;
}

Archipelago - SGU 120(计算几何向量旋转)的更多相关文章

  1. SGU 120 Archipelago (简单几何)

    120. Archipelago time limit per test: 0.25 sec.  memory limit per test: 4096 KB Archipelago Ber-Isla ...

  2. ACM 计算几何向量

    向量 简介注意事项基本计算 加减法 ~ 示例代码 长度 ~ 示例代码 数乘 ~ 示例代码 点积 应用 ~ 示例代码 叉积 ~ 示例代码 性质与应用 经典题目 向量旋转 操作目的 模板代码 简介 向量, ...

  3. 今日SGU 5.26

    #include<bits/stdc++.h> #define de(x) cout<<#x<<"="<<x<<endl ...

  4. canvas 图片拖拽旋转之一——坐标转换translate

    引言 对canvas中绘制的图片进行旋转操作,需要使用ctx.translate变换坐标系,将图片旋转的基点设为坐标系的原点,然后ctx.rotate旋转. 这个时候,因为canvas坐标系发生了旋转 ...

  5. iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

    一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...

  6. C#利用GDI+绘制旋转文字等效果

    C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...

  7. Unity脚本-Rotate旋转相关知识点

    1,Transform旋转   transform.Rotate(X, Y, Z);//分别绕X,Y,Z轴旋转,可写为绕某个轴旋转,栗子transform.Rotate(0, 90, 0);   tr ...

  8. unity2D以最小的角度旋转到目标方向(y方向为角色的主方向)

    一.使用向量原理转换到目标方向 为了让角色的自身y转向目标方向,并且以最小角度旋转,要点是获得当前方向与目标方向的叉值,从而判断应该旋转的方向 float rotateSpeed; //相对目标位置运 ...

  9. PCB 合拼遍历(全排序+旋转90度) 基本遍历方法

    分享一下PCB合拼的组合的遍历方法,在分享之前先纠正一下 PCB拼板之多款矩形排样算法实现--学习  时间复杂度计算错误  一.PCB 合拼(全排序+旋转90度)的时间复杂度是多少? 二.合拼遍历(全 ...

随机推荐

  1. CoreAnimation5-图层时间和缓冲

    图层时间 动画的发生是需要持续一段时间的,所以计时对整个概念来说至关重要.在这一章中,我们来看看CAMediaTiming,看看Core Animation是如何跟踪时间的. CAMediaTimin ...

  2. Constant is not finite! That's illegal. constant:inf'

    原本使用正常的情况, 切换为测试库突然出现这个错误, 网上搜索并排查后得出导致这个问题的原因: (1)就是你的除数为0(2)除数或者被除数为null 找出你出错的界面, 并打断点, 看看是否出现上面两 ...

  3. jfreechart环形图完美实现

    邮件发送由于不支持js,项目只能在后台生成环形图,用jfreechart完全可以实现,即:RingPlot. 这就拿jfreechart生成的最终效果,依赖jar包jfreechart,如果有任何细节 ...

  4. POJ 1564(HDU 1258 ZOJ 1711) Sum It Up(DFS)

    题目链接:http://poj.org/problem?id=1564 题目大意:给定一个整数t,和n个元素组成的集合.求能否用该集合中的元素和表示该整数,如果可以输出所有可行解.1<=n< ...

  5. SGU 269. Rooks(DP)

    题意: 给n(<=250)条水平网格,然后在上面放k棋子,每行每列都只能放一个.求方法总数. Solution: 简单的DP, 只要对给出的水平长度排个序就很容易处理了. 需要用到高精度. 偷懒 ...

  6. JavaScript学习心得(五)

    一时间 1970年1月1日是电脑常用的时间参考点,称为纪元(Epoch)或者UNIX时间戳(UNIX Epoch).JavaScript中的Date对象能够表示1970年1月1日子夜前后1亿天之内的任 ...

  7. Android Camera拍照 压缩

    http://www.linuxidc.com/Linux/2014-12/110924.htm package com.klp.demo_025; import java.io.ByteArrayI ...

  8. memcached在linux安装

    服务器端主要是安装memcache服务器端.下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz另外,Memcache用到了lib ...

  9. 用gtest实现数据驱动的单元测试

    //使用gtest进行数据驱动的单元测试 #include <gtest/gtest.h> #include <iostream> #include <vector> ...

  10. vs2008生成的各种文件

    一.sln文件     .sln(Solution)解决方案文件,表示一个项目组,他通常包含一个项目中所有的工程文件信息.   二.suo文件     suo(Solution User Option ...