这次来计算一下世界空间三角形的外心(也就是外接圆的圆心)和外心为起点的平面法向量。

问题:假设我们世界空间中有一个任意三角形,且已知三角形各个顶点ABC的坐标,求三角形的外心P和外心所在的法向量n,如下图:

如果依稀还记得初中几何,就知道一个平面三角形外心计算规则:三角形任意两边的中垂线交点,则为外心。三角形所在平面法向量:以一顶点为端点的逆时针方向两条边的叉积则为平面法向量。

其实一眼就看得出来原理:两条中垂线组成的三角形APC、BPC为等腰三角形,则AP=BP=CP,即P点位外心。

那么我们任意选取三角形一边如AC,计算中垂线DP,根据AP=BP,则可以求出外心P的坐标,如下:

假设△ABC的外心为P(x,y,z),条件整理如下:

1.△ABC各个顶点坐标已知

2.P(x,y,z)在△ABC所处的平面中,可以带入平面方程计算(平面方程理解)

3.PD⊥AC,即dot(PD,AC) = 0

4.D = (A+C)/2

5.AP、BP、CP模长相同

将这些条件用来计算P(x,y,z),我们尝试一下:

我们通过条件整理出①②③三个三元一次方程,接下来我们通过三元一次方程求解,如下:

将①②③带入三元一次方程解:

方程的参数和根巨复杂,我自己推导起来都要不停的返回瞄一下是否参数写错了,小伙伴们可能需要很仔细的查看推导过程。

当然我们还是要用c#代码来实现一下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TriangleVerticeCenter : MonoBehaviour
{public Transform TA;public Transform TB;public Transform TC;public Transform TP;void Start(){}void Update(){Vector3 p = CalculateTriangleOutCircleCenter(TA.position, TB.position, TC.position);TP.position = p;//PN法向量Vector3 PB = TB.position - p;Vector3 PC = TC.position - p;Vector3 PN = Vector3.Cross(PB, PC).normalized;Vector3 n = p + PN;
#if UNITY_EDITORDebug.DrawLine(TA.position, TB.position, Color.black);Debug.DrawLine(TB.position, TC.position, Color.black);Debug.DrawLine(TC.position, TA.position, Color.black);Debug.DrawLine(TA.position, p, Color.white);Debug.DrawLine(TB.position, p, Color.white);Debug.DrawLine(TC.position, p, Color.white);Debug.DrawLine(p, n, Color.red);Debug.LogFormat("AP = {0} BP = {1} CP = {2}", Vector3.Distance(TA.position, p), Vector3.Distance(TB.position, p), Vector3.Distance(TC.position, p));
#endif}private Vector3 CalculateTriangleOutCircleCenter(Vector3 A, Vector3 B, Vector3 C){float Xa = A.x;float Ya = A.y;float Za = A.z;float Xb = B.x;float Yb = B.y;float Zb = B.z;float Xc = C.x;float Yc = C.y;float Zc = C.z;Vector3 D = (A + C) / 2;float Xd = D.x;float Yd = D.y;float Zd = D.z;//单位法向量ANVector3 AB = B - A;Vector3 AC = C - A;Vector3 AN = Vector3.Cross(AB, AC).normalized;float u = AN.x;float v = AN.y;float w = AN.z;//构建三元一次方程参数float a = u;float b = v;float c = w;float d = u * Xa + v * Ya + w * Za;float e = Xc - Xa;float f = Yc - Ya;float g = Zc - Za;float h = (Xc - Xa) * (Xc + Xa) / 2 + (Yc - Ya) * (Yc + Ya) / 2 + (Zc - Za) * (Zc + Za) / 2;float k = 2 * Xb - 2 * Xa;float l = 2 * Yb - 2 * Ya;float m = 2 * Zb - 2 * Za;float n = Xb * Xb - Xa * Xa + Yb * Yb - Ya * Ya + Zb * Zb - Za * Za;float[] equa = CalculateTernaryEquation(a, b, c, d, e, f, g, h, k, l, m, n);Vector3 P = new Vector3(equa[0], equa[1], equa[2]);return P;}private float[] CalculateTernaryEquation(float a, float b, float c, float d, float e, float f, float g, float h, float k, float l, float m, float n){float z = ((d * e - a * h) * (f * k - e * l) - (h * k - e * n) * (b * e - a * f)) / ((c * e - a * g) * (f * k - e * l) - (b * e - a * f) * (g * k - e * m));float y = ((d * e - a * h) * (g * k - e * m) - (h * k - e * n) * (c * e - a * g)) / ((b * e - a * f) * (g * k - e * m) - (f * k - e * l) * (c * e - a * g));float x = 0;if (a != 0)x = (d - b * y - c * z) / a;else if (e != 0)x = (h - f * y - g * z) / e;else if (k != 0)x = (n - l * y - m * z) / k;return new float[] { x, y, z };}
}

效果如下:

可以通过图形标注和打印信息看得出来,外接圆心和法向量计算正确。

几何向量:空间三角形外心和法向量相关推荐

  1. 三角形外心坐标的计算公式

    三角形外心坐标的计算公式 给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢? 例如 :给定\(a(x1,y1) b(x2,y2) c(x3,y3)\)求外接圆心坐标\(O(x,y)\) 首先,外接 ...

  2. C语言算三角形外心坐标,【c语言】三角形外心坐标

    新学期第一个算法大作业就好坑爹... 要计算三角形外接圆...做模板用吧 # include # include double X1,Y1,X2,Y2,X3,Y3,x4,y4,length1,leng ...

  3. 【公式编辑测试】解析几何-三角形外心重心垂心内心公式

    文章目录 三角形重心GGG 向量 直角坐标 三角形外心OOO 向量 直角坐标 三角形垂心HHH 向量 直角坐标 三角形内心III 向量 直角坐标 坐标原点 ooo,三角形外心 OOO,重心 GGG,垂 ...

  4. C语言算三角形外心坐标,三角形外心坐标公式(含C语言代码).pdf

    三角形外心坐标公式(含C语言代码).pdf (1页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 =2 − + − − −2 − + − ...

  5. 三角形外心坐标c语言,算法提高 12-1三角形   外心坐标

    问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的周长.面积.中心和重心.输入三个点,输出这三个点构成的三角形的周长.面积.外心和重心.结果保留 ...

  6. 空间三角形_如何改造三角形小屋,营造舒适空间?

    该项目旨在对一间始建于1960年的公寓进行改造.公寓的原始结构呈明显的三角形,各种房间碎片化地分布于内,一条长长的黑色走廊贯穿了整个空间.项目团队希望通过改变原先的空间布局.消除所有类型的通道空间来将 ...

  7. 最简理解空间三角形中线与边的交点

    接之前最简理解空间射线与平面交点的场景. 获得射线打在三角形上的交点(之后称为"打点")后,假设三角形为p1,p2,p3,打点为c,想求直线p1c和p2p3的交点. 转化为射线与p ...

  8. 空间三角形_教师招聘试讲-小学数学 三角形内角和 教案

    一.教学目标 [知识与能力]探究并掌握三角形内角和是180°,并能应用三角形内角和解决一些简单的实际问题. [过程与方法]学生在探索过程中,发现和提出问题,通过用转化的思想,培养学生的空间观念,几何直 ...

  9. 空间三角形_如何用现代数学表述全等与全等三角形?

    初中数学用了很大的篇幅讲述几何学,其中全等与全等三角形占据重要的地位. 在初中数学的教材上,称形状.大小都相同的图形是全等的,但是什么叫形状.大小呢?教材上根本就没有给出严格的定义. 数学这一学科追求 ...

最新文章

  1. python软件界面-用Python写一个语音播放软件
  2. 详解shuffle过程(转载)
  3. asp.net添加删除表格_你问我答|135编辑器使用之超链接和表格问题
  4. JEPaas代码_((表单)_输入字段值而改变值)
  5. SQL JOIN,你想知道的应该都有
  6. Spring Cloud Stream与RabbitMQ 生产者和消费者位于同一个应用服务
  7. SimpleXML系列函数操作XML
  8. tensorflow loss到多少_tensorflow学习笔记day4
  9. Linux 十四 修改文件操作权限 用户文件权限详解
  10. 数据挖掘:数据清洗——缺失值处理
  11. 网易免费/付费163企业邮smtp服务器地址
  12. mac命令行压缩解压rar文件
  13. 如何查看计算机硬盘的软件内存条,内存检测工具,内存检测软件 - 内存条检测工具就用金山卫士 - 安全专题...
  14. 搞笑新闻联播之老公岗位制度(中)铃声 搞笑新闻联播之老公岗...
  15. SQL中的DML语句
  16. WCP知识库 开源版 Win安装配置
  17. mysql表collate冲突_数据库排序规则的冲突(理解collate Chinese_PRC_CI_AS)
  18. 2016 移动应用质量大数据报告
  19. Win11+安卓子系统安装使用
  20. 嵌入式学习——串口通信小试

热门文章

  1. Beta分布(Beta Distribution)
  2. 创业粉去哪里引流?如何精准引流创业粉?创业粉的引流技巧
  3. Python_Task02:条件、循环结构
  4. git 合并分支(开发分支dev合并到主分支master)
  5. 耳机声控,以及耳机拔出或者插入控制播放暂停
  6. framework层的event_log分析
  7. win10版本号怎么查看
  8. 数字化转型的三个重点方向
  9. 编程基础篇:#1082 : 然而沼跃鱼早就看穿了一切
  10. 鸿蒙大战是什么,混沌氏(浑沌)、鸿蒙氏,盘古开天辟地时两个最强大的部落首领?...