向量旋转 UPC 2217

这道题目是13山东省省赛的签到题,题目大意是给等边三角形的两个定点,让求逆时针旋转之后的第三个点的坐标,原来不会向量的旋转,在网上找了找,找到一篇挺好的,直接贴过来。

向量的旋转

实际做题中我们可能会遇到很多有关及计算几何的问题,其中有一类问题就是向量的旋转问题,下面我们来具体探讨一下有关旋转的问题。

先我们先把问题简化一下,我们先研究一个点绕另一个点旋转一定角度的问题。已知A点坐标(x1,y1),B点坐标(x2,y2),我们需要求得A点绕着B点旋转θ度后的位置。

如图:A‘ 就是A点绕B点旋转θ角度后得到的点,问题是我们要如何才能得到A‘ 点的坐标。(向逆时针方向旋转角度正,反之为负)研究一个点绕另一个点旋转的问题,我们可以先简化为一个点绕原点旋转的问题,这样比较方便我们的研究。之后我们可以将结论推广到一般的形式上。令B是原点,我们先以A点向逆时针旋转为例,我们过A‘ 做AB的垂线,交AB于C,过C做x轴的平行线交过A‘ 做x轴的垂线于D。过点C做x轴的垂线交x轴于点E。

A的坐标(x,y),A‘ 坐标(x1,y1),B的坐标(0,0)。我们可以轻松的获取AB的长度,而且显而易见A‘ B长度等于AB。假设我们已知θ角的大小那么我们可以很快求出BC和A‘ C的长度。BC=A‘ B x cosθ,A‘ C=A‘ B x sinθ。

因为∠A‘ CB和∠DCE为直角(显然的结论),则∠A‘ CD +∠DCB =∠ECD +∠DCB=90度。

则∠A‘ CD=∠ECD,∠A‘ DC=∠CEB=90度,因此可以推断⊿CA‘ D ∽⊿CBE。由此可以退出的结论有:

BC/BE=A‘ C/A‘ D和BC/CE=A‘ C/CD

当然了DC和A‘ D都是未知量,需要我们求解,但是我们却可以通过求出C点坐标和E点坐标间接获得A‘ C和CD的长度。我们应该利用相似的知识求解C点坐标。

C点横坐标等于:((|AB| x cosθ) / |AB|) * x = x*cosθ

C点纵坐标等于:((|AB| x cosθ) / |AB|) * y = y*cosθ

则CE和BE的的长度都可以确定。

我们可以通过相⊿CA‘ D ∽⊿CBE得出:

AD = x * sinθ   DC = y * sinθ

那么接下来很容易就可以得出:

x1 = x*cosθ- y * sinθ y1 = y*cosθ + x * sinθ

则A‘ 的坐标为(x*cosθ- y * sinθ, y*cosθ + x * sinθ)

我们可以这样认为:对于任意点A(x,y),A非原点,绕原点旋转θ角后点的坐标为:(x*cosθ- y * sinθ, y*cosθ + x * sinθ)

接下来我们对这个结论进行一下简单的推广,对于任意两个不同的点A和B(对于求点绕另一个点旋转后的坐标时,A B重合显然没有太大意义),求A点绕B点旋转θ角度后的坐标,我们都可以将B点看做原点,对A和B进行平移变换,计算出的点坐标后,在其横纵坐标上分别加上原B点的横纵坐标,这个坐标就是A‘ 的坐标。

推广结论:对于任意两个不同点A和B,A绕B旋转θ角度后的坐标为:

(Δx*cosθ- Δy * sinθ+ xB, Δy*cosθ + Δx * sinθ+ yB )//结论

注:xB、yB为B点坐标。

结论的进一步推广:对于任意非零向量AB(零向量研究意义不大),对于点C进行旋转,我们只需求出点A和B对于点C旋转一定角度的坐标即可求出旋转后的向量A‘ B‘ ,因为向量旋转后仍然是一条有向线段。同理,对于任意二维平面上的多边形旋转也是如此。

以上是比较简单的,最后把结论记好就行了。上面是绕B点进行旋转的,所以Δx = xa - xb, Δy = ya - yb,如果绕A反过来就行了。

题目代码:

/*************************************************************************
    > File Name:            upc_2217.cpp
    > Author:               Howe_Young
    > Mail:                 [email protected]
    > Created Time:         2015年04月29日 星期三 20时03分21秒
 ************************************************************************/

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>

using namespace std;

int main()
{
    int t;
    double x1, y1, x2, y2;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%lf %lf %lf %lf", &x1,  &y1, &x2, &y2);
        double x3, y3;
        x3 = (x2 - x1) * 0.5 - (y2 - y1) * sqrt(3.0) / 2.0 + x1;
        y3 = (y2 - y1) * 0.5 + (x2 - x1) * sqrt(3.0) / 2.0 + y1;
        printf("(%.2f,%.2f)\n", x3, y3);
    }
    return 0;
}

时间: 2024-10-14 20:12:36

向量旋转 UPC 2217的相关文章

一维向量旋转算法 编程珠玑 第二章

看了编程珠玑第二章,这里面讲了三道题目,这里说一下第二题,一维向量旋转算法. 题目:将一个n元一维向量(例数组)向左旋转i个位置. 解决方法:书上讲解了5种方法,自己只想起来2种最简单方法(下面讲的前两种). 1.原始方法. 从左向右依次移动一位,对所有数据平移:这样循环i次,算法最坏时间复杂度达n^2.耗时不推荐. 2.空间换时间. 顾名思义,申请一个i长度的空间,把前i半部分放到申请空间中,再把后面的所有数据向左移动i个位置,最后把申请的空间中的数据放到后半部分.浪费空间,不推荐. 3.杂技

sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)

Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a beast caught a beautiful princess and the princess was put in prison. To rescue the princess, a prince who wanted to marry the princess set out immedia

计算几何之向量旋转

实际做题中我们可能会遇到很多有关及计算几何的问题,其中有一类问题就是向量的旋转问题,下面我们来具体探讨一下有关旋转的问题. 首先我们先把问题简化一下,我们先研究一个点绕另一个点旋转一定角度的问题.已知A点坐标(x1,y1),B点坐标(x2,y2),我们需要求得A点绕着B点旋转θ度后的位置. A点绕B点旋转θ角度后得到的点,问题是我们要如何才能得到A' 点的坐标.(向逆时针方向旋转角度正,反之为负)研究一个点绕另一个点旋转的问题,我们可以先简化为一个点绕原点旋转的问题,这样比较方便我们的研究.之后

HDU 1700 Points on Cycle (几何 向量旋转)

http://acm.hdu.edu.cn/showproblem.php?pid=1700 题目大意: 二维平面,一个圆的圆心在原点上.给定圆上的一点A,求另外两点B,C,B.C在圆上,并且三角形ABC的周长是最长的. 解题思路: 我记得小学的时候给出个一个定理,在园里面正多边形的的周长是最长的,这个定理我不会证明. 所以这里是三角形,当三角形为正三角形的时候,周长是最长的. 因为圆心在原点,所以我就向量(x,y)绕原点逆时针旋转120度和顺时针旋转120度.给定的点A可以看成(x,y)向量.

UVA_11178_Morley&#39;s_Theorem_(向量旋转+直线相交)

描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=23&page=show_problem&problem=2119 Morley定理:作三角形ABC每个内角的三等分线,相交形成三角形DEF,则三角形DEF是等边三角形. 给出三角形的三个顶点ABC的坐标,求出DEF的坐标. 11178 - Morley's Theorem Time limit: 3.000 s

向量旋转

// 向量v0沿着Y轴旋转45度得到v1 Vector3 v0; Vector3 v1 = Quaternion.AngleAxis(45, Vector3.up) * v0; // 某游戏物体绕Y轴旋转30度得到的新Quaternion Quaternion rotation = Quaternion.Euler(0f,30f,0f) * Target.rotation; // 沿着Target的X轴延伸10米求目标点的3D坐标 Vector3 newPos = Target.position

POJ2194 Stacking Cylinders(向量旋转)

题目链接: http://poj.org/problem?id=2194 题目描述: Stacking Cylinders Description Cylinders (e.g. oil drums) (of radius 1 foot) are stacked in a rectangular bin. Each cylinder on an upper row rests on two cylinders in the row below. The cylinders in the bott

简单几何(向量旋转+凸包+多边形面积) UVA 10652 Board Wrapping

题目传送门 题意:告诉若干个矩形的信息,问他们在凸多边形中所占的面积比例 分析:训练指南P272,矩形面积长*宽,只要计算出所有的点,用凸包后再求多边形面积.已知矩形的中心,向量在原点参考点再旋转,角度要转换成弧度制. /************************************************ * Author :Running_Time * Created Time :2015/11/10 星期二 10:34:43 * File Name :UVA_10652.cpp

POJ 2991 Crane(线段树&#183;向量旋转)

题意  有一个Crane由n条线段连接组成  每个连接点处均可以任意旋转  给你n条线段的长度  然后又m次旋转操作  给你p和r  将第p和第p+1条线段之间的角度旋转为r  即第p条线段绕p的终点逆时针旋转r度后能够与第p+1条重合  问每次旋转后最后一条线段的终点坐标 可以发现  旋转第p+1条线段时  p+1后面的所有线段也一起旋转了  可以把Crane分解为n个向量  这些向量的和也就是Crane终点的坐标  用rad[i]保存第i个向量与第i+1个向量之间的夹角  每次旋转操作时