hdu 2671(点关于直线对称问题)
2012-04-22 10:03
190 查看
View Code
/* * 题目所求:在直线上找一点P,使其与其它(A,B)两点组成的距离最短 * 点A跟点B与直线的位置情况四种: * 1.两点在直线的同侧(两点都不在直线上) * 2.两点在直线的异侧(两点都不在直线上) * 3.其中一点在直线上 * 4.两点都在直线上 * auther:Try86 */ #include <cmath> #include <cstdio> #include <cstdlib> #include <iostream> using namespace std; struct point {//点结构 double x; double y; }A, B, C; struct segment {//线段结构 point s; point e; }seg; struct line {//直线结构,标准式 double a; double b; double c; }l; double k; double dis(point A, point B) { return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)); } int segXLine(line l, segment seg) {//判断线段是否跟直线相交 if ((l.a*seg.s.x+l.b*seg.s.y+l.c)*(l.a*seg.e.x+l.b*seg.e.y+l.c)<=0) return 1; return 0; } double solve() { point D; double ans = 0; l.a = k; //直线标准式 l.b = -1; l.c = C.y - k * C.x; seg.s = A; //线段 seg.e = B; if (segXLine(l, seg)) ans = dis(A, B);//相交,则直接求两点距离即可 else { D.x = ((l.b*l.b-l.a*l.a)*A.x - 2*l.a*l.b*A.y - 2*l.a*l.c) / (l.a*l.a+l.b*l.b);//求点A关于直线的对称点 D.y = ((l.a*l.a-l.b*l.b)*A.y - 2*l.a*l.b*A.x - 2*l.b*l.c) / (l.a*l.a+l.b*l.b); ans = dis(B, D);//所求 } return ans; } int main() { int t; scanf ("%d", &t); while (t--) { scanf ("%lf", &k); scanf ("%lf%lf%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y, &C.x, &C.y); double ans = solve(); printf ("%.2lf\n", ans); } return 0; }
相关文章推荐
- HDU 2671 Can't be easier(数学题,点关于直线对称)
- HDU 2671 Can't be easier 求点关于直线的对称点
- HDU 2898 空间点关于直线旋转
- 20170419 关于绘制余弦曲线和直线的一些问题
- hdu 2857(对称点与直线交点问题)
- 关于正定矩阵是不是一定对称的问题
- 关于直线,折线切割平面的问题
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
- 关于直线,折线切割平面的问题
- 点关于直线的距离、垂足、对称点公式
- 创建直线的问题 关于数组的问题
- HDOJ 题目2857 Mirror and Light(关于直线对称点,直线交点)
- 关于有容量下界的网络可行流问题解决的学习笔记 ZOJ 2314 ZOJ 3229 HDU 3157
- Hdu 1287 【关于异或要注意的问题】.cpp
- 「HDU - 2857」Mirror and Light(点关于直线的对称点)
- hdu 2857:Mirror and Light(计算几何,点关于直线的对称点,求两线段交点坐标)
- HDU-1097 A hard puzzle 题解以及关于超时问题的处理
- 关于直线、折线分割平面,平面的分割空间问题
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
- 已知点(x0,y0),ax+by+c=0,求点关于直线对称