• HDU5733 tetrahedron


    计算几何题 给出四个点 求这四个点构成三棱锥的内切球的三维坐标和半径

    先判断这个四个点是否共面 共面就直接输出O O O O 然后就用公式啦

    注意scanf的时候要用%lf 最开始用的%f就各种出现nan和inf

    这里贴个链接公式的链接 http://www.docin.com/p-504197705.html?qq-pf-to=pcqq.c2c

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 typedef unsigned long long ull;
     5 
     6 class point{
     7 public:
     8     double x;
     9     double y;
    10     double z;
    11     point(double xx = 0, double yy = 0, double zz = 0){
    12         x = xx;
    13         y = yy;
    14         z = zz;
    15     }
    16 };
    17 
    18 point operator -(point a, point b){
    19     return point(a.x - b.x, a.y - b.y, a.z - b.z);
    20 }
    21 
    22 point cross_product(point a, point b){
    23     return point(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
    24 }
    25 
    26 double dot_product(point a, point b){
    27     return a.x * b.x + a.y * b.y + a.z * b.z;
    28 }
    29 
    30 double Herons_formula(double a, double b, double c){
    31     double p = (a + b + c) / 2;
    32     return sqrt(p * (p - a) * (p - b) * (p - c));
    33 }
    34 
    35 double dist(point a, point b){
    36     return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z));
    37 }
    38 
    39 int main(){
    40     point A, B, C, D;
    41     point AB, AC, AD;
    42     double s1, s2, s3, s4;
    43     double ab, ac, ad, bc, bd, cd;
    44     double x, y, z, r;
    45     double V;
    46     while (scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &A.x, &A.y, &A.z, &B.x, &B.y, &B.z, &C.x, &C.y, &C.z, &D.x, &D.y, &D.z) != EOF){
    47         AB = A - B;
    48         AC = A - C;
    49         AD = A - D;
    50         V = abs(dot_product(cross_product(AB , AC), AD) / 6);
    51         if (V == 0){
    52             cout<<"O O O O"<<endl;
    53             continue;
    54         }
    55         ab = dist(A, B);
    56         ac = dist(A, C);
    57         ad = dist(A, D);
    58         bc = dist(B, C);
    59         bd = dist(B, D);
    60         cd = dist(C, D);
    61         s1 = Herons_formula(bc, bd, cd);
    62         s2 = Herons_formula(ac, ad, cd);
    63         s3 = Herons_formula(ab, ad, bd);
    64         s4 = Herons_formula(ab, ac, bc);
    65         x = (s1 * A.x + s2 * B.x + s3 * C.x + s4 * D.x) / (s1 + s2 + s3 + s4);
    66         y = (s1 * A.y + s2 * B.y + s3 * C.y + s4 * D.y) / (s1 + s2 + s3 + s4);
    67         z = (s1 * A.z + s2 * B.z + s3 * C.z + s4 * D.z) / (s1 + s2 + s3 + s4);
    68         r = (V * 3) / (s1 + s2 + s3 + s4);
    69         printf("%.4lf %.4lf %.4lf %.4lf
    ", x, y, z, r);
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    u-boot 2011.09 调用kernel 的流程
    Delphi repeat Until 运用
    clientdataset的使用
    类型TTreeView.items.add 与 TTreeView.items.addchild有何区别?(10分)
    delphi中nil、null、UnAssigned区别
    操作TreeView(咏南工作室)
    delphi7 treeview + 数据库 实现动态节点维护
    Delphi Try Except 实例
    Delphi 中自定义异常及异常处理的一般方法
    Delphi中的异常处理(10种异常来源、处理、精确处理)
  • 原文地址:https://www.cnblogs.com/Misuchii/p/10897095.html
Copyright © 2020-2023  润新知