当前位置: 首页 > news >正文

做网站为什么要购买空间/网络推广大概需要多少钱

做网站为什么要购买空间,网络推广大概需要多少钱,制作网站需要多少钱,延庆县专业网站制作网站建设文章目录一、问题描述二、解题思路​ 在做项目时遇到了一个数学问题,即,如何判断给定一个三角面片与空间中某个球体有相交部分?这个问题看似简单,实际处理起来需要一些方法和手段。一、问题描述 已知空间中球体的球心位置center&a…

文章目录

        • 一、问题描述
        • 二、解题思路

​ 在做项目时遇到了一个数学问题,即,如何判断给定一个三角面片与空间中某个球体有相交部分?这个问题看似简单,实际处理起来需要一些方法和手段。

一、问题描述

已知空间中球体的球心位置center,半径为r,三角形三个顶点分别为v1,v2,v3。判断该三角形与球体是否有交点?

二、解题思路

​ 通过写写画画,我们可以大致将球体和三角形的位置分为以下三种情况:

(一)三角形三个顶点至少有一个在球体内部

image-20230305153905184

​ 这种情况相对来说比较简单,只需要判断三角形三个顶点到球心的最小距离<半径 r 即可。

(二)三个顶点都在球体外部,但至少有一条线段与球体相交

image-20230305154203013

​ 计算三边所在直线到球心的距离,最短距离 < r 即可。

​ 但是同时需要确保 ∠OAC\angle OACOAC∠OCA\angle OCAOCA 均< ∠ODA\angle ODAODA,否则会出现以下错误的情况:

image-20230305154357287

​ 根本原因是,我们求的是线段与球体相交,而不是一条直线。

(三)三个顶点、三条边都在球体外部,但平面与球体相交

image-20230305154528284

​ 同理,计算球心到平面的距离 < r 即可。

​ 一样的,需要避免以下的情况,原因一样,我们求的是三角形与球体是否有交点,而不是平面:

image-20230305154638704

​ 判断方式:作球心 O 到平面 ABC 的投影 P,看 P 是否在三角形内部:

image-20230305154737066
  • 方法一: 面积法。算出三角形 ABP、BCP、CAP 的面积和,与 ABC 面积进行比较。如果相同,则 P 在内部

  • 方法二: 矢量法。若 P 在三角形内部,则:

    • 对 BC 而言,P、A 在同一侧
    • 对 CA 而言,P、B 在同一侧
    • 对 AB 而言,P、C 在同一侧

    可以用矢量的叉乘判断两点是否在线段的同一侧。

    即,对于 BC 而言,BP→×BC→\overrightarrow{BP}\times\overrightarrow{BC}BP×BCBP→×BA→\overrightarrow{BP}\times\overrightarrow{BA}BP×BA 同向,则 P、A 在同一侧。

实现代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Segment
{public Vector3 start; // 起始位置public Vector3 end;   // 终点位置/// <summary>/// 线段向量/// </summary>public Vector3 vector => end - start;/// <summary>/// 单位方向/// </summary>public Vector3 direction => vector.normalized;/// <summary>/// 线段长度/// </summary>public float length => vector.magnitude;public Segment(Vector3 start, Vector3 end) {this.start = start;this.end   = end;}/// <summary>/// 计算点到线段所在直线的距离/// </summary>/// <param name="point">点</param>/// <returns></returns>public float LineDistance(Vector3 point) {float theta = Vector3.Angle(point - start, vector);return (point - start).magnitude * Mathf.Sin(Mathf.Deg2Rad * theta);}/// <summary>/// 线段是否穿过球体/// </summary>/// <param name="center">球心</param>/// <param name="radius">半径</param>/// <returns></returns>public bool CrossSphere(Vector3 center, float radius) {// 如果线段两端点其中一个在球体内部,直接返回 trueif (Vector3.Distance(center, start) < radius || Vector3.Distance(center, end) < radius) return true;// 球心到线段距离大于半径,则返回 falsefloat d = LineDistance(center);if (d >= radius) return false;// 计算球心与线段的两个夹角,以判断线段是否穿过球体float theta = Mathf.Asin(d / radius) * Mathf.Rad2Deg;float a1    = Vector3.Angle(center - start, vector);float a2    = Vector3.Angle(center - end,   -vector);return a1 <= theta && a2 <= theta;}/// <summary>/// 判断两点是否处于线段同一侧/// </summary>/// <param name="p1">点 1</param>/// <param name="p2">点 2</param>/// <returns></returns>public bool SameSide(Vector3 p1, Vector3 p2) {Vector3 v1 = Vector3.Cross(p1 - start, vector);Vector3 v2 = Vector3.Cross(p2 - start, vector);return Vector3.Dot(v1, v2) >= 0;}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 三角形
/// </summary>
public class Triangle
{public Vector3 v1; // 顶点 1public Vector3 v2; // 顶点 2public Vector3 v3; // 顶点 3/// <summary>/// 线段 12/// </summary>public Segment l1 => new Segment(v1, v2);/// <summary>/// 线段 23/// </summary>public Segment l2 => new Segment(v2, v3);/// <summary>/// 线段 31/// </summary>public Segment l3 => new Segment(v3, v1);/// <summary>/// 所在平面/// </summary>public Plane plane => new Plane(v1, v2, v3);public Triangle(Vector3 v1, Vector3 v2, Vector3 v3) {SetInfo(v1, v2, v3);}/// <summary>/// 设置三角形位置/// </summary>/// <param name="v1">顶点 1</param>/// <param name="v2">顶点 2</param>/// <param name="v3">顶点 3</param>public void SetInfo(Vector3 v1, Vector3 v2, Vector3 v3) {this.v1 = v1;this.v2 = v2;this.v3 = v3;}/// <summary>/// 顶点到点 point 的最小距离/// </summary>/// <param name="point">点 point</param>/// <returns></returns>public float MinPointDistance(Vector3 point) {float   d1 = Vector3.Distance(v1, point);float   d2 = Vector3.Distance(v2, point);float   d3 = Vector3.Distance(v3, point);return Mathf.Min(d1, d2, d3);}/// <summary>/// 投影转化为平面三角形(大小不变)/// </summary>/// <param name="center">投影中心</param>/// <returns>平面三角形</returns>public Triangle2D CastTriangle2D(Vector3 center) {Vector3 origin  = plane.ClosestPointOnPlane(center);Vector3 vector1 = v1 - origin;Vector3 vector2 = v2 - origin;Vector3 vector3 = v3 - origin;float a12 = Vector3.SignedAngle(vector1, vector2, plane.normal) * Mathf.Deg2Rad;float a13 = Vector3.SignedAngle(vector1, vector3, plane.normal) * Mathf.Deg2Rad;Vector2 p1 = new Vector2(vector1.magnitude,                  0);Vector2 p2 = new Vector2(vector2.magnitude * Mathf.Cos(a12), vector2.magnitude * Mathf.Sin(a12));Vector2 p3 = new Vector2(vector3.magnitude * Mathf.Cos(a13), vector3.magnitude * Mathf.Sin(a13));return new Triangle2D(p1, p2, p3);}/// <summary>/// 判断三角形是否穿过球体/// </summary>/// <param name="center">球心</param>/// <param name="radius">半径</param>/// <returns></returns>public bool CrossSphere(Vector3 center, float radius) {// 如果最近的点在球体内部则返回 tureif (MinPointDistance(center) < radius) return true;// 如果有线段穿过了球体,则返回 trueif (l1.CrossSphere(center, radius) || l2.CrossSphere(center, radius) || l3.CrossSphere(center, radius)) return true;// 否则投影球心到三角平面上,看其是否在三角形内float d = Mathf.Abs(plane.GetDistanceToPoint(center));if (d < radius) {                            // 球心到平面的距离小于半径才可能相交Triangle2D t2D = CastTriangle2D(center); // 进行投影return t2D.Contains(Vector2.zero);       // 判断}return false;}
}
using System;
using UnityEngine;/// <summary>
/// 平面线段
/// </summary>
public class Segment2D
{public Vector2 start; // 起始位置public Vector2 end;   // 终点位置/// <summary>/// 线段向量/// </summary>public Vector2 vector => end - start;/// <summary>/// 单位方向/// </summary>public Vector2 direction => vector.normalized;public float length => vector.magnitude;/// <summary>/// 线段长度/// </summary>public Segment2D(Vector2 start, Vector2 end) {this.start = start;this.end   = end;}/// <summary>/// 判断两点是否处于线段同一侧/// </summary>/// <param name="p1">点 1</param>/// <param name="p2">点 2</param>/// <returns></returns>public bool SameSide(Vector2 p1, Vector2 p2) {Vector3 v1 = Vector3.Cross(p1 - start, vector);Vector3 v2 = Vector3.Cross(p2 - start, vector);return Vector3.Dot(v1, v2) >= 0;}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Triangle2D 
{public Vector2 v1; // 顶点 1public Vector2 v2; // 顶点 2public Vector2 v3; // 顶点 3/// <summary>/// 线段 12/// </summary>public Segment2D l1 => new Segment2D(v1, v2);/// <summary>/// 线段 23/// </summary>public Segment2D l2 => new Segment2D(v2, v3);/// <summary>/// 线段 31/// </summary>public Segment2D l3 => new Segment2D(v3, v1);public Triangle2D(Vector2 v1, Vector2 v2, Vector2 v3) {SetInfo(v1, v2, v3);}/// <summary>/// 设置三角形位置/// </summary>/// <param name="v1">顶点 1</param>/// <param name="v2">顶点 2</param>/// <param name="v3">顶点 3</param>public void SetInfo(Vector2 v1, Vector2 v2, Vector2 v3) {this.v1 = v1;this.v2 = v2;this.v3 = v3;}/// <summary>/// 判断点 point 是否在三角形内部/// </summary>/// <param name="point">点</param>/// <returns></returns>public bool Contains(Vector2 point) {return l1.SameSide(point, v3) && l2.SameSide(point, v1) && l3.SameSide(point, v2);}
}

相关文章:

判断三角面片与空间中球体是否相交

文章目录一、问题描述二、解题思路​ 在做项目时遇到了一个数学问题&#xff0c;即&#xff0c;如何判断给定一个三角面片与空间中某个球体有相交部分&#xff1f;这个问题看似简单&#xff0c;实际处理起来需要一些方法和手段。一、问题描述 已知空间中球体的球心位置center&a…...

继承下的缺省参数值和访问说明符

前言 本文将介绍 C 继承体系下&#xff0c;函数缺省参数的绑定和函数访问说明符的绑定。这些奇怪的问题实际上不应在我们的代码中出现&#xff0c;但它们能帮助我们理解 C 的动态绑定和静态绑定&#xff0c;也能帮助我们更好的通过面试。 缺省参数值 先来看一段代码&#xf…...

Spring核心模块—— BeanFactoryPostProcessorBeanPostProcessor(后处理器)

后置处理器前言Spring的后处理器BeanFactoryPostProcessor&#xff08;工厂后处理器&#xff09;执行节点作用基本信息经典场景子接口——BeanDefinitiRegistryPostProcessor基本介绍用途具体原理例子——注册BeanDefinition使用Spring的BeanFactoryPostProcessor扩展点完成自定…...

产品新人如何培养产品思维?

什么是产品思维&#xff1f;其实很难定义&#xff0c;不同人有不同的定义。有的人定义为以用户为中心打磨一个完美体验的产品&#xff1b;有的定义为从需求调研到需求上线各个步骤需要思考的点&#xff0c;等等。本文想讨论的产品思维是&#xff1a;怎么去发现问题&#xff0c;…...

「兔了个兔」CSS如此之美,看我如何实现可爱兔兔LOADING页面(万字详解附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…...

【Java】阻塞队列 BlcokingQueue 原理、与等待唤醒机制condition/await/singal的关系、多线程安全总结

在实习过程中使用阻塞队列对while sleep 轮询机制进行了改造&#xff0c;提升了发送接收的效率&#xff0c;这里做一点点总结。 自从Java 1.5之后&#xff0c;在java.util.concurrent包下提供了若干个阻塞队列&#xff0c;BlcokingQueue继承了Queue接口&#xff0c;是线程安全…...

【水下图像增强】Enhancing Underwater Imagery using Generative Adversarial Networks

原始题目Enhancing Underwater Imagery using Generative Adversarial Networks中文名称使用 GAN 增强水下图像发表时间2018年1月11日平台ICRA 2018来源University of Minnesota, Minneapolis MN文章链接https://arxiv.org/abs/1801.04011开源代码官方&#xff1a;https://gith…...

Maven专题总结—详细版

第一章 为什么使用Maven 获取jar包 使用Maven之前&#xff0c;自行在网络中下载jar包&#xff0c;效率较低。如【谷歌、百度、CSDN…】使用Maven之后&#xff0c;统一在一个地址下载资源jar包【阿里云镜像服务器等…】 添加jar包 使用Maven之前&#xff0c;将jar复制到项目工程…...

华为OD机试真题Java实现【字符串加密】真题+解题思路+代码(20222023)

字符串加密 题目 给你一串未加密的字符串str, 通过对字符串的每一个字母进行改变来实现加密, 加密方式是在每一个字母str[i]偏移特定数组元素a[i]的量, 数组a前三位已经赋值:a[0]=1,a[1]=2,a[2]=4。 当i>=3时,数组元素a[i]=a[i-1]+a[i-2]+a[i-3], 例如:原文 abcde …...

「Python 基础」函数与高阶函数

文章目录1. 函数调用函数定义函数函数的参数递归函数2. 高阶函数map/reducefiltersorted3. 函数式编程返回函数匿名函数装饰器偏函数1. 函数 函数是一种重复代码的抽象方式&#xff0c;Python 内建支持的一种封装&#xff1b; 调用函数 调用一个函数&#xff0c;需要知道函数…...

DIV内容滚动,文字符滚动标签marquee兼容稳定不卡

marquee(文字滚动)标签 marquee简介 <marquee>标签,是成对出现的标签,首标签<marquee>和尾标签</marquee>之间的内容就是滚动内容。 <marquee>标签的属性主要有behavior、bgcolor、direction、width、height、hspace、vspace、loop、scrollamount、scr…...

SpringBoot_第五章(Web和原理分析)

目录 1&#xff1a;静态资源 1.1&#xff1a;静态资源访问 1.2&#xff1a;静态资源源码解析-到WebMvcAutoConfiguration 2&#xff1a;Rest请求绑定&#xff08;设置put和delete&#xff09; 2.1&#xff1a;代码实例 2.2&#xff1a;源码分析到-WebMvcAutoConfiguratio…...

4-2 Linux进程和内存概念

文章目录前言进程状态进程优先级内存模型进程内存关系前言 进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。一般来说&#xff0c;Linux系统会在进程之间共享程序代码和系统函数库&#xff0c;所以在任何时刻内存中都只有代码的一份拷贝。 进程状态…...

【微信小程序】计算器案例

&#x1f3c6;今日学习目标&#xff1a;第二十一期——计算器案例 ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;30分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 计算器前言实现效果实现步骤wxmlwxssjs数字按钮事件处理函数计算按钮处理事…...

408 计算机基础复试笔记 —— 更新中

计算机组成原理 计算机系统概述 问题一、冯诺依曼机基本思想 存储程序&#xff1a;程序和数据都存储在同一个内存中&#xff0c;计算机可以根据指令集执行存储在内存中的程序。这使得程序具有高度灵活性和可重用性。指令流水线&#xff1a;将指令分成若干阶段&#xff0c;每…...

找出最大数-课后程序(Python程序开发案例教程-黑马程序员编著-第二章-课后作业)

实例6&#xff1a;找出最大数 “脑力大乱斗”休闲益智游戏的关卡中&#xff0c;有一个题目是找出最大数。本实例要求编写程序&#xff0c;实现从输入的任意三个数中找出最大数的功能。 实例分析 对于3个数比较大小&#xff0c;我们可以首先先对两个数的大小进行比较&#xff…...

Java——N叉树的层序遍历

题目链接 leetcode在线oj题——N叉树的层序遍历 题目描述 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 null 值分隔&#xff08;参见示例&…...

【Kubernetes】第十八篇 - k8s 服务发现简介

一&#xff0c;前言 上一篇&#xff0c;介绍了阿里云 ECS 服务器重启后的环境修复&#xff1b; 本篇&#xff0c;介绍 k8s 服务发现&#xff1b; 二&#xff0c;服务发现简介 当 A服务依赖了 B服务&#xff0c;而 B服务的IP和端口未知&#xff08;或相对不固定&#xff09;&…...

Codeforces Round 856 (Div. 2) 最好ak的div2

最近几场的div2 E都是一个思路啊&#xff0c;代码大差不差的&#xff0c;感觉随便ak啊。 A. Prefix and Suffix Array 题意 给你前n−1n-1n−1个字符串前缀和后n−1n-1n−1个字符串后缀&#xff0c;判断原字符串是否是回文串 思路 相同长度的判断是否是对称的即可。 代码 B C…...

最新JVM技术: GraalVM,让你一文了解它的方方面面

1. 什么是GraalVM? GraalVM是一种开源的虚拟机平台,由Oracle公司开发。它支持多种编程语言,包括Java、JavaScript、Python、Ruby、R、C++等,旨在提高应用程序的性能和扩展性。 GraalVM通过提供即时编译器(Just-in-Time Compiler,JIT)和Ahead-of-Time(AOT)编译器来提…...

MySQL索引失效的场景

1.like 以%开头&#xff0c;索引无效&#xff1b;当like前缀没有%&#xff0c;后缀有%时&#xff0c;索引有效。 2.数据库表数据量过小 如果表的数据量非常小&#xff0c;则MySQL可能不会使用索引&#xff0c;因为它认为全表扫描的代价更小。 3.or语句前后没有同时使用索引 …...

Java - 对象的比较

一、问题提出 前面讲了优先级队列&#xff0c;优先级队列在插入元素时有个要求&#xff1a;插入的元素不能是null或者元素之间必须要能够进行比较&#xff0c;为了简单起见&#xff0c;我们只是插入了Integer类型&#xff0c; 那优先级队列中能否插入自定义类型对象呢&#xf…...

[算法]选择排序

目录 1、选择排序的实现 2、例子 3、代码实现 4、时间复杂度和空间复杂度 5、选择排序的缺点——不稳定性 1、选择排序的实现 选择排序就是每一轮选择最小的元素直接交换到左侧。这种排序的最大优势&#xff0c;就是省去了多余的元素交换。 2、例子 原始数组和选择排序的…...

dp模型——状态机模型C++详解

状态机定义状态机顾名思义跟状态有关系&#xff0c;但到底有什么关系呢。在实际解决的时候&#xff0c;通常把状态想成节点&#xff0c;状态的转换想成有向边的有向图&#xff0c;我们来举个例子。相信大家都玩过类似枪战的游戏&#xff08;没玩过的也听说过吧&#xff09;&…...

1.4 条件概率与乘法公式

1.4.1 条件概率在实际问题中&#xff0c;除了直接考虑某事件 B 发生的概率P(B)外,有时还会碰到这样的问题&#xff0c;就是“在事件A 已经发生的条件下,事件B 发生的概率”。一般情况下,后概率与前一概率不同&#xff0c;为了区别,我们常把后者称为条件概率&#xff0c;记为P(B…...

VITA/PYTHON/LUPA families

Image Sensor Group Top to Bottom Portfolio in Industrial Imaging Machine Vision • Factory automation and inspection • Robotic vision • Biometrics High-End Surveillance • Aerial Surveillance • Intelligent Traffic Systems (ITS) • Mapping Medical and Sc…...

ChatGPT概述:从模型训练到基本应用的介绍

ChatGPT概述&#xff1a;从模型训练到基本应用的介绍 目录 本文是对ChatGPT的由来、训练过程以及实际落地场景的解释&#xff0c;主要内容包括如下三个方面&#xff1a; 1、ChatGPT是什么 2、ChatGPT的原理 3、ChatGPT的思考 4、ChatGPT的应用 ChatGPT是什么 ChatGPT可能是近…...

C语言实现扫雷【详细讲解+全部源码】

扫雷的实现1. 配置运行环境2. 扫雷游戏的初步实现2.1 建立扫雷分布模块2.2 创建名为board的二维数组并进行棋盘初始化2.3 打印棋盘3. 接下来该讨论的事情3.1 布置雷3.2 排查雷3.3 统计坐标周围有几个雷4. 完整扫雷游戏的实现4.1 game.h4.2 game.c4.3 扫雷.c1. 配置运行环境 本游…...

Vue2.0开发之——购物车案例-Goods组件封装-商品名称和图片(46)

一 概述 循环渲染Goods组件为Goods组件封装title属性为Goods组件封装pic属性 二 循环渲染Goods组件 2.1 App.vue中导入Goods组件 import Goods from /components/Goods/Goods.vue2.2 App.vue中注册Goods组件 components: {Header,Goods}2.3 循环渲染每一个商品的信息 <…...

0201基础-组件-React

1 组件和模块 1.1 模块 对外提供特定功能的js程序&#xff0c;一般就是一个js文件 为什么拆分模块呢&#xff1f;随着业务逻辑增加&#xff0c;代码越来越多&#xff0c;越来越复杂。作用&#xff1a;复用js&#xff0c;简化js&#xff0c;提高js运行效率 1.2 模块化 当应用…...