• nyoj-1132-promise me a medal(求线段交点)


    题目链接

     1 /*
     2     Name:nyoj-1132-promise me a medal
     3     Copyright:
     4     Author:
     5     Date: 2018/4/26 20:26:22
     6     Description:
     7     向量之间的运算,不熟悉就绕蒙逼了
     8     用 ACM国际大学生程序设计竞赛 算法与实现的模板
     9     有个坑:    如果第二条线段的起点是第一条线段的终点,那么不需要计算  
    10      
    11     1
    12     1 2 1 3 1 3 1 4
    13     输出
    14     yes 1.0 3.0 
    15     
    16 */
    17 #include <iostream>
    18 #include <cstdio>
    19 #include <cmath>
    20 #include <algorithm>
    21 using namespace std;
    22 const double pi = acos(-1.0);
    23 inline double sqr(double x) {
    24     return x * x;
    25 }
    26 const double eps = 1e-8;
    27 int cmp(double x) {
    28     if (fabs(x) < eps) return 0;
    29     if (x >0 )return 1;
    30     return -1;
    31 }
    32 //point
    33 struct point {
    34     double x, y;
    35     point (){}
    36     point (double a, double b):x(a), y(b) {    }
    37     void input() {
    38         scanf("%lf %lf", &x, &y);
    39     }
    40     friend point operator - (const point &a, const point &b) {
    41         return point(a.x-b.x, a.y-b.y);
    42     }
    43     friend point operator * (const double &a, const point &b) {
    44         return point (a * b.x, a*b.y);
    45     }
    46     friend point operator / (const point &a, const double &b) {
    47         return point (a.x / b, a.y /b);
    48     }
    49     friend bool operator == (const point &a, const point &b) {
    50         return (cmp(a.x - b.x) == 0 && cmp(a.y - b.y) == 0);
    51     }
    52 };
    53 double det(const point &a, const point &b) {
    54     return a.x * b.y - a.y * b.x;
    55 }
    56 //line
    57 struct line {
    58     point a, b;
    59     line() {    }
    60     line(point x, point y):a(x), b(y){    }
    61 };
    62 line point_make_line(const point a, const point b) {
    63     return line(a, b);
    64 }
    65 bool parallel(line a, line b)  {
    66     return !cmp(det(a.a - a.b, b.a - b.b));
    67 }
    68 bool line_make_point(line a, line b, point &res) {
    69     if(parallel(a,b)) return false;
    70     double s1 = det(a.a-b.a, b.b - b.a);
    71     double s2 = det(a.b-b.a, b.b - b.a);
    72     res = (s1 * a.b - s2 * a.a)/(s1-s2);
    73     return true;
    74 }
    75 int main()
    76 {
    77     int t;
    78     cin>>t;
    79     while (t--) {
    80         point a, b ,c ,d;
    81         cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;
    82         line ab(a, b), cd(c, d);
    83         if (b == c) {//如果第二条线段的起点是第一条线段的终点,那么不需要计算 
    84             cout<<"yes ";
    85             printf("%.1f %.1f
    ",b.x, b.y) ;
    86             continue;
    87         }
    88         if (parallel(ab, cd)) cout<<"no
    ";
    89         else {
    90             cout<<"yes ";
    91             point ans;
    92             line_make_point(ab, cd, ans);
    93             printf("%.1f %.1f
    ",ans.x, ans.y) ;
    94         }
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    16 类成员
    [Tips] WSL ubuntu 18.04 安装python3
    [Tips]ubuntu安装go
    [Notes] 随笔的标题格式说明
    [Tips]Ubuntu手动修改DNS
    [BUG]Ubuntu 16.04 出现“sudo unable to resolve host”
    [Tips]ubuntu 换源
    [Tips]将本地git文件夹上传云端
    [Notes] Dockerfile中COPY命令的简单性
    [BUG]Ubuntu server 16.04安装,无网卡驱动解决
  • 原文地址:https://www.cnblogs.com/langyao/p/8955050.html
Copyright © 2020-2023  润新知