sdut2603&hdu1700(向量旋转)

sdut2603

地址:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2603

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 immediately. Yet, the beast set a maze. Only if the prince find out the maze’s exit can he save the princess.

    Now, here comes the problem. The maze is a dimensional plane. The beast is smart, and he hidden the princess snugly. He marked two coordinates of an equilateral triangle in the maze. The two marked coordinates are A(x1,y1) and B(x2,y2). The third coordinate C(x3,y3) is the maze’s exit. If the prince can find out the exit, he can save the princess. After the prince comes into the maze, he finds out the A(x1,y1) and B(x2,y2), but he doesn’t know where the C(x3,y3) is. The prince need your help. Can you calculate the C(x3,y3) and tell him?

输入

    The first line is an integer T(1 <= T <= 100) which is the number of test cases. T test cases follow. Each test case contains two coordinates A(x1,y1) and B(x2,y2), described by four floating-point numbers x1, y1, x2, y2 ( |x1|, |y1|, |x2|, |y2| <= 1000.0).
    Please notice that A(x1,y1) and B(x2,y2) and C(x3,y3) are in an anticlockwise direction from the equilateral triangle. And coordinates A(x1,y1) and B(x2,y2) are given by anticlockwise.

输出

    For each test case, you should output the coordinate of C(x3,y3), the result should be rounded to 2 decimal places in a line.

示例输入

4
-100.00 0.00 0.00 0.00
0.00 0.00 0.00 100.00
0.00 0.00 100.00 100.00
1.00 0.00 1.866 0.50

示例输出

(-50.00,86.60)
(-86.60,50.00)
(-36.60,136.60)
(1.00,1.00)


题意:给出两个点A,B,求出一个可以与这两点组成等边三角形的点C,要求A,B,C顺序为逆时针。 

 
利用向量旋转的公式,向量旋转:
 
B为原点,A为坐标为(x,y)的点,A`(x1,y1)为A逆时针旋转θ度的点。过A`做AB的垂线交AB于C点,过A`做
 
垂直于x轴的线与过c点做平行于x轴的线交于D点,过C点做垂直于x轴的线交x轴于E点。
 
因为∠A`CB与∠DCE都是直角,所以∠A`CD=∠BCE,所以⊿CA' D ∽⊿CBE。
 
则x1=CE+A`C/BC*BE,y1=BE-A`C/BC*CE。

#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;

int main()
{
	int t;
	double x1,x2,x3,y1,y2,y3;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
		x3=(x1+x2)/2-sqrt(3.0)*((y2+y1)/2-y1);    //这里sqrt(3)就是A`C/BC
		y3=(y1+y2)/2+sqrt(3.0)*((x2+x1)/2-x1);
		printf("(%.2lf,%.2lf)\n",x3,y3);
	}
}

hdu1700

Points on Cycle

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1290    Accepted Submission(s): 451


Problem Description
There is a cycle with its center on the origin.
Now give you a point on the cycle, you are to find out the other two points on it, to maximize the sum of the distance between each other
you may assume that the radius of the cycle will not exceed 1000.
 

Input
There are T test cases, in each case there are 2 decimal number representing the coordinate of the given point.
 

Output
For each testcase you are supposed to output the coordinates of both of the unknow points by 3 decimal places of precision 
Alway output the lower one first(with a smaller Y-coordinate value), if they have the same Y value output the one with a smaller X. 

NOTE
when output, if the absolute difference between the coordinate values X1 and X2 is smaller than 0.0005, we assume they are equal.
 

Sample Input
   
   
2 1.500 2.000 563.585 1.251
 

Sample Output
   
   
0.982 -2.299 -2.482 0.299 -280.709 -488.704 -282.876 487.453
 

题意:给一个点,该点在一个圆心为原点的圆的边上,在圆内找两个点使这三个点距离和最大。
思路:要是三个点距离和最大,那么这三个点在圆内一定组成等边三角形。
#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;

int main()
{
	int t;
	double x1,x2,x3,y1,y2,y3;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lf%lf",&x1,&y1);
		x2=x1/2-sqrt(3.0)*y1/2;  //因为三个点与圆心连线之间的角度为120°(等边三角形)
		y2=y1/2+sqrt(3.0)*x1/2;  //所以我们可以看为输入的这个点与圆心连线逆时针旋转两个60°
		x1=x2/2-sqrt(3.0)*y2/2;
		y1=y2/2+sqrt(3.0)*x2/2;
		x2=x1;y2=y1;
		x3=x1/2-sqrt(3.0)*y1/2;
		y3=y1/2+sqrt(3.0)*x1/2;
		x1=x3/2-sqrt(3.0)*y3/2;
		y1=y3/2+sqrt(3.0)*x3/2;
		x3=x1;y3=y1;
		if(y2-y3||(fabs(y3-y2)<0.0005&&(x2-x3)>0.0005))  //关于0.0005的判定在题目中有交代
		{
			x1=x3;x3=x2;x2=x1;
			y1=y3;y3=y2;y2=y1;
		}
		printf("%.3lf %.3lf %.3lf %.3lf\n",x2,y2,x3,y3);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SDUT(山东理工职业学院)在Java教学方面,通常会涵盖Java编程基础、面向对象编程、异常处理、集合框架、流式编程、文件操作以及数据库访问等内容。Java作为一种广泛使用的编程语言,因其平台无关性、面向对象、安全性等特点,在高校及企业中非常受欢迎。在教学过程中,学生会通过理论学习和实践练习来掌握Java语言的核心概念和应用。 学生在学习Java时,会逐步了解如何使用Java开发环境,例如安装JDK、配置环境变量等,之后会通过编写小程序来实践基本语法,如数据类型、控制流(if-else、switch、循环等)、数组的使用等。进一步,学生将学习类与对象的创建和使用,掌握继承、多态等面向对象编程的基本概念,并通过接口和抽象类的应用来实现多态。 异常处理方面,学生会学习如何捕获和处理运行时可能出现的错误,提高程序的健壮性。Java的集合框架,包括List、Set、Map等接口和实现类,是处理数据集合的重要工具,学生会学习如何操作这些集合。流式编程是Java 8引入的一个重要特性,学生会学习Lambda表达式和Stream API的使用,以实现更加简洁和高效的数据处理。 文件操作和数据库访问是Java应用程序与数据存储交互的常见方式。学生会学习如何使用Java I/O类读写文件,以及使用JDBC与关系数据库进行数据的存取操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值