HDU4998Rotate(矩阵变换)

题目大意:HDU4998Rotate(矩阵变换)

题目大意:要求你将一个图形每次绕着一个点旋转p,这样旋转了n次后,问这样的图形可以一次绕着哪个点旋转多少。

解题思路:每次的旋转都等价于一次矩阵的变换。n次旋转就做n次矩阵变换,最后在根据最后得到的矩阵来反推出旋转点和度数。因为可能会有cos(r) == 0的情况所以用atan2函数不会出错。

绕着某个点旋转p的矩阵变换

代码:

#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

const int N = 15;
const double pi = acos(-1.0);

struct Rec {

	double v[3][3];
	Rec () { memset (v, 0, sizeof (v));}
	void init (double Cx, double Cy, double r) {

		v[0][0] = cos(r);
		v[0][1] = sin(r);
		v[1][0] = -sin(r);
		v[1][1] = cos(r);
		v[2][0] = Cx - Cx * cos(r) + Cy * sin(r);
		v[2][1] = Cy - Cx * sin(r) - Cy * cos(r);
		v[2][2] = 1;
	}

	Rec operator * (const Rec& a) {

		Rec tmp;
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++)
				for (int k = 0; k < 3; k++)
					tmp.v[i][j] += v[i][k] * a.v[k][j];
		return tmp;
	}

	Rec operator *= (const Rec& a) {
		return *this = *this * a;
	}

}rec[N];

int main () {

	int T;
	int n;
	double x, y, r;
	scanf ("%d", &T);
	while (T--) {

		scanf ("%d", &n);
		for (int i = 0; i < n; i++) {

			scanf ("%lf%lf%lf", &x, &y, &r);
			rec[i].init (x, y, r);
		}

		Rec ans = rec[0];
		for (int i = 1; i < n; i++)
			ans *= rec[i];

		r = atan2 (ans.v[0][1], ans.v[0][0]);
		if (r < 0)
			r = 2 * pi + r;
		double a1 = (1 - ans.v[0][0]);
		double a2 = ans.v[0][1];
		double b1 = a1;
		double b2 = a2;
		double A = ans.v[2][0];
		double B = ans.v[2][1];
		y = (A * b2 + B * a1) / (a1 * b1 + a2 * b2);
		x = (b1 * y - B) / b2;
		printf ("%.10lf %.10lf %.10lf\n", x, y, r);
	}
	return 0;
}
时间: 2024-10-09 01:31:13

HDU4998Rotate(矩阵变换)的相关文章

Cg入门10:Vertex Shader - 几何变换 —MVP矩阵变换

Unity内建矩阵类型: M:世界矩阵 V:摄像机矩阵 P:投影矩阵 T :矩阵的转置 IT : 转置的的逆 _Object2World: 模型到世界矩阵 _World2Object:世界到模型矩阵 MVP 矩阵变换:Shader Demo MVP 转置变换:C# demo Matrix4x4 mvp = Camera.main .projectionMatrix * Camera.main .worldToCameraMatrix * transform .localToWorldMatrix

Silverlight学习之RenderTransform特效(五种基本变换)及(矩阵变换MatrixTransform)

RenderTransform特效: 变形(RenderTransform)类是为了达到直接去改变某个Silverlight对象的形状(比如缩放.旋转一个元素)的目的而设计的,RenderTransform包含的变形属性成员就是专门用来改变Silverlight对象形状的,它可以实现对元素拉伸,旋转,扭曲等效果,同时变形特效也常用于辅助产生各种动画效果,下面列出RenderTransform类的成员: l  TranslateTransform:能够让某对象的位置发生平移变化. l  Rotat

【蓝桥杯】矩阵变换加密法(playfair)

一种Playfair密码变种加密方法如下:首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入至一个5x5的方阵中,填入方法如下: 1.首先按行填入密钥串. 2.紧接其后,按字母序按行填入不在密钥串中的字母. 3.由于方阵中只有25个位置,最后剩下的那个字母则不需变换. 如果密钥为youandme,则该方阵如下: y o u a n d m e b c f g h i j k l p q r s t v w x 在加密一对字母时,如am,在方阵中找到

OCC 矩阵变换

在OpenCADCADE中, 通过gp_Trsf类来进行矩阵变换操作, 采用矩阵在左的方式: 新点 = 变换矩阵 * 点 基本原理如下: //! Defines a non-persistent transformation in 3D space. //! The following transformations are implemented : //! . Translation, Rotation, Scale //! . Symmetry with respect to a poin

uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

[清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N.    矩阵中每个数都是 [0,N] 中的自然数.    每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每行中 0 恰好出现 M−N 次.    每列中,[1,N] 中每个自然数至多出现一次. 现在我们要在每行中选取一个非零数,

二维图形的矩阵变换(三)——在WPF中的应用矩阵变换

UIElement和RenderTransform 首先,我们来看看什么样的对象可以进行变换.在WPF中,用于呈现给用户的对象的基类为Visual类,但是Visual对象并不具有变换功能,具有变换功能的是它的子类UIElement.这个类也是非常底层的类了,几乎我们所有的常用控件都是继承自它,也就是说,基本上所有的UI对象都是可以应用变换的. 然后,我们在再来看看UIElement中变换种类.UIElement支持两种变换:RenderTransform和LayoutTransform,其中La

二维图形的矩阵变换(二)——WPF中的矩阵变换基础

在前文二维图形的矩阵变换(一)——基本概念中已经介绍过二维图像矩阵变换的一些基础知识,本文中主要介绍一下如何在WPF中进行矩阵变换. Matrix结构 在WPF中,用Matrix结构(struct类型)表示二维变换矩阵,它是一个3*3的数组,结构如下, 由于第三列是常量0,0,1,因此并不作为公开属性,可见的只有剩余六个属性. 构造变换 虽然Matrix类公开了这六个属性让我们设置,但是靠直接设置这六个属性来实现平移.旋转等变换对于我们来说实在太困难了,因此又增加了如下许多函数来帮助我们实现这一

二维图形的矩阵变换(一)——基本概念

基本的二维变换可包括旋转.缩放.扭曲,和平移四种,              而这些几何运算则可以转换为一些基本的矩阵运算: 这几个变换都是线性的,但平移运算不是线性的,不能通过2*2矩阵运算完成.若要将点 (2, 1)在 x 方向将其平移 3 个单位,在 y 方向将其平移 4 个单位. 可通过先使用矩阵乘法再使用矩阵加法来完成此操作. 综合这几种基本运算,数学家们将其统一为一个3*3矩阵,存储形式如下: 由于表示仿射变换的矩阵的第三列总是(0,0,1),在存储矩阵的时候,大多只存成一个2*3的

浅谈矩阵变换——Matrix

矩阵变换在图形学上经常用到.基本的常用矩阵变换操作包括平移.缩放.旋转.斜切. 每种变换都对应一个变换矩阵,通过矩阵乘法,可以把多个变换矩阵相乘得到复合变换矩阵. 矩阵乘法不支持交换律,因此不同的变换顺序得到的变换矩阵也是不相同的. 事实上,图像处理时,矩阵的运算是从右边往左边方向进行运算的.这就形成了越在右边(右乘)的矩阵,越先运算(先乘),反之亦然.所以,右乘就是先乘,左乘就是后乘. 复合变换矩阵T = 变换矩阵T1 x 变换矩阵T2 x 变换矩阵T3. 图形是由一个个点组成的,得到变换矩阵