国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

鄭州建設(shè)企業(yè)網(wǎng)站百度一下 你就知道官方

鄭州建設(shè)企業(yè)網(wǎng)站,百度一下 你就知道官方,中美貿(mào)易最新動態(tài),那個做圖網(wǎng)站叫什么目錄 前言 方法一 原理 代碼 測試 結(jié)果 方法二 原理 一、檢查連線與球體的相交情況 二、檢查距離與球體半徑的關(guān)系 三、檢查連線與球體的相交 代碼 前言 通過數(shù)學(xué)原理判斷空間中任意兩點(diǎn)的連線是否穿過球體,再通過射線檢測檢驗(yàn)算法的正確性。 方法一 …

目錄

前言

方法一?

原理

代碼

測試

結(jié)果

方法二

原理

一、檢查連線與球體的相交情況

二、檢查距離與球體半徑的關(guān)系

三、檢查連線與球體的相交

代碼


前言

???????通過數(shù)學(xué)原理判斷空間中任意兩點(diǎn)的連線是否穿過球體,再通過射線檢測檢驗(yàn)算法的正確性。

方法一?

原理

(1)設(shè)球體球心的坐標(biāo)為O(C_{x},C_{y},C_{z})?,半徑為r;

(2)設(shè)線段AB中A點(diǎn)的坐標(biāo)為A(x_{1},y_{1},z_{1}),B點(diǎn)的坐標(biāo)為B(x_{2},y_{2},z_{2})

(3)計(jì)算\underset{OA}{\rightarrow}、\underset{OB}{\rightarrow}\underset{AB}{\rightarrow}

(4)計(jì)算點(diǎn)O到?線段AB的最短距離d

d=\frac{|\underset{OA}{\rightarrow}\times \underset{AB}{\rightarrow}|}{|\underset{AB}{\rightarrow}|}

(5)?如果d\leq r,則線段AB穿過球體;如果d> r,則線段AB不穿過球體。

代碼

????????定義一個函數(shù)“IsCrossSphere”來判斷線段AB是否穿過球體,函數(shù)需要傳入點(diǎn)A、B的坐標(biāo)以及球心坐標(biāo)和球體半徑。

再定義一個結(jié)構(gòu)體作為函數(shù)返回值

函數(shù)“IsCrossSphere”的實(shí)現(xiàn)如下

頭文件:

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "LineIsCrossSphere.generated.h"USTRUCT(BlueprintType)
struct FStruct_Result_IsLineCrossSphere
{GENERATED_BODY();
public:UPROPERTY(BlueprintReadWrite)float distanceOfLineAndSphereCenter;UPROPERTY(BlueprintReadWrite)bool isCrossSphere;
};UCLASS()
class STUDY_API ALineIsCrossSphere : public AActor
{GENERATED_BODY()public:	// Sets default values for this actor's propertiesALineIsCrossSphere();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;UFUNCTION(BlueprintCallable)FStruct_Result_IsLineCrossSphere IsCrossSphere(FVector pointA, FVector pointB, FVector sphereOrginPoint, float sphereRadius);   //計(jì)算線段AB到球心的距離并判斷AB是否穿過球體public:	// Called every framevirtual void Tick(float DeltaTime) override;};

源文件:

// Fill out your copyright notice in the Description page of Project Settings.#include "Test/LineIsCrossSphere.h"// Sets default values
ALineIsCrossSphere::ALineIsCrossSphere()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;}// Called when the game starts or when spawned
void ALineIsCrossSphere::BeginPlay()
{Super::BeginPlay();}FStruct_Result_IsLineCrossSphere ALineIsCrossSphere::IsCrossSphere(FVector pointA, FVector pointB, FVector sphereOrginPoint, float sphereRadius)
{bool isCrossSphere;FVector OA = pointA - sphereOrginPoint;FVector OB = pointB - sphereOrginPoint;FVector AB = OB - OA;FVector n = OA.Cross(AB);float D = n.Size() / AB.Size();if (D > sphereRadius){isCrossSphere =  false;}else{isCrossSphere =  true;}FStruct_Result_IsLineCrossSphere result;result.isCrossSphere = isCrossSphere;result.distanceOfLineAndSphereCenter = D;return result;
}// Called every frame
void ALineIsCrossSphere::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}

測試

????????在Tick中每幀去發(fā)射射線檢測并調(diào)用函數(shù)?“IsCrossSphere”,通過觀察射線碰撞結(jié)果以及函數(shù)?“IsCrossSphere”的打印是否相等來判斷算法是否有誤。(這里設(shè)置球體半徑固定為50,球體坐標(biāo)為(0,0,0))

結(jié)果

????????可以看到不論是線段在球體表面,穿過球體,還是在球體外,函數(shù)?“IsCrossSphere”與射線檢測的結(jié)果都是一致的。

方法二

原理

一、檢查連線與球體的相交情況

????????使用距離公式計(jì)算點(diǎn)?A到球體中心O?的距離d_{A},以及點(diǎn)?B到地球中心O?的距離d_{B},設(shè)點(diǎn)AA(x_{1},y_{1},z_{1}),點(diǎn)BB(x_{2},y_{2},z_{2})。

d_{A}=\sqrt{(x_{1}-C_{x})^{2}+(y_{1}-C_{y})^{2}+(z_{1}-C_{z})^{2}}

d_{B}=\sqrt{(x_{2}-C_{x})^{2}+(y_{2}-C_{y})^{2}+(z_{2}-C_{z})^{2}}

二、檢查距離與球體半徑的關(guān)系

????????如果?d_{A}\leq R?且?d_{B}\leq R,則兩點(diǎn)都在球體內(nèi)部,它們的連線顯然穿過球體;

????????如果?d_{A}> R?且?d_{B}> R,則兩點(diǎn)都在球體外部,需要進(jìn)一步檢查它們的連線是否與球體相交。

三、檢查連線與球體的相交

????????當(dāng)兩點(diǎn)都在球體外部時,我們可以計(jì)算直線?AB?的參數(shù)方程,并嘗試找到與球體表面(即半徑為?R?的球體)的交點(diǎn)。將直線的參數(shù)方程代入球體的方程,并解出一個關(guān)于參數(shù)的二次方程。如果這個二次方程有實(shí)數(shù)解,并且解對應(yīng)的參數(shù)值在?0?和?1?之間(對于參數(shù)化的線段?AB),則連線與球體相交。

?(1)表示直線參數(shù)方程

????????對于線段AB的參數(shù)方程可以表示為

r(t)=(1-t)A+tB

r(t)=((1-t)x_{1}+tx_{2},(1-t)y_{1}+ty_{2},(1-t)z_{1}+tz_{2})?

?????????其中t是參數(shù),0\leqslant t\leqslant 1表示線段AB上的點(diǎn)

(2)表示球體方程

????????設(shè)球體球心的坐標(biāo)為O(C_{x},C_{y},C_{z})?,半徑為R,則球體方程可表示為

(x-C_{x})^{2}+(y-C_{y})^{2}+(z-C_{z})^{2}=R^{2}

(3)將直線的參數(shù)方程代入球體的方程中,得到一個關(guān)于t的二次方程

?

?展開并整理后,可得到一個標(biāo)準(zhǔn)的二次方程形式:at^{2}+bt+c=0

(4)使用求根公式可以得到二次方程的解

(5)如果二次方程沒有實(shí)數(shù)解(\Delta < 0),則直線不與球體相交;

? ? ? ? ?如果二次方程有一個實(shí)數(shù)解,并且解在?0≤t≤1?的范圍內(nèi),則線段?AB?與球體相交于一點(diǎn);

????????如果二次方程有兩個不同的實(shí)數(shù)解,并且至少有一個解在?0≤t≤1?的范圍內(nèi),則直線段?AB?與球體相交于兩點(diǎn)(即線段穿過球體)。

代碼

bool ALineIsCrossSphere::IsCrossSphere2(FVector pointA, FVector pointB, FVector sphereOrginPoint, float sphereRadius)
{float D_A = sqrt(pow(pointA.X - sphereOrginPoint.X, 2) + pow(pointA.Y - sphereOrginPoint.Y, 2) + pow(pointA.Z - sphereOrginPoint.Z, 2));  //計(jì)算點(diǎn)A到球體中心的距離float D_B = sqrt(pow(pointB.X - sphereOrginPoint.X, 2) + pow(pointB.Y - sphereOrginPoint.Y, 2) + pow(pointB.Z - sphereOrginPoint.Z, 2));  //計(jì)算點(diǎn)B到球體中心的距離if (D_A <= sphereRadius && D_B <= sphereRadius)  //兩點(diǎn)都在球體內(nèi)部,它們的連線顯然穿過球體{return true;}else if (D_A > sphereRadius && D_B > sphereRadius)  //兩點(diǎn)都在球體外部{//將直線的參數(shù)方程代入球體的方程,得到標(biāo)準(zhǔn)二次方程的a、b、cfloat a = pow(pointB.X - pointA.X, 2) + pow(pointB.Y - pointA.Y, 2) + pow(pointB.Z - pointA.Z, 2);float b = 2 * ((pointB.X - pointA.X) * (pointA.X - sphereOrginPoint.X) + (pointB.Y - pointA.Y) * (pointA.Y - sphereOrginPoint.Y) + (pointB.Z - pointA.Z) * (pointA.Z - sphereOrginPoint.Z));float c = pow(pointA.X - sphereOrginPoint.X, 2) + pow(pointA.Y - sphereOrginPoint.Y, 2) + pow(pointA.Z - sphereOrginPoint.Z, 2) - pow(sphereRadius, 2);float discriminant = b * b - 4 * a * c;if (discriminant > 0.0f)  //△>0{// 有兩個不同的實(shí)數(shù)解float t1 = (-1*b + sqrt(pow(b, 2) - 4 * a * c)) / (2 * a);float t2 = (-1*b - sqrt(pow(b, 2) - 4 * a * c)) / (2 * a);if ((0 <= t1 && t1 <= 1) || (0 <= t2 && t2 <= 1)){return true;  //至少有一個解在0~1,則線段 AB 與球體相交于兩點(diǎn)}else {return false;  //直線與球體在無限遠(yuǎn)處相交,即線段沒有穿過球體}}else if (discriminant == 0.0f)  //△=0{// 有兩個相等的實(shí)數(shù)解(或說是一個重根)float t = (-1 * b) / (2 * a);if (t >= 0 && t <= 1){return true;  //直線段 AB 與球體相交于一點(diǎn)}else{return false; //雖然直線在無限延伸的情況下會與球體相交,但交點(diǎn)并不在連接點(diǎn)A和點(diǎn)B的線段上,因此沒有相交}}else  //△<0{// 沒有實(shí)數(shù)解,直線不與球體相交return false;}}else  //一點(diǎn)在球體內(nèi)部,另一點(diǎn)在球體外部,則它們的連線一定穿過球體{return true;}
}
http://aloenet.com.cn/news/30106.html

相關(guān)文章:

  • ??谄髽I(yè)網(wǎng)站建設(shè)愛站網(wǎng)關(guān)鍵詞挖掘查詢工具
  • p2p網(wǎng)站開發(fā)的多少錢一個產(chǎn)品的網(wǎng)絡(luò)營銷方案
  • 大氣集團(tuán)網(wǎng)站源碼科學(xué)新概念seo外鏈平臺
  • 網(wǎng)站建設(shè)圖文百度網(wǎng)頁網(wǎng)址
  • 做網(wǎng)站購買服務(wù)器國外常用的seo站長工具
  • 企業(yè)網(wǎng)站建設(shè) 西寧公司網(wǎng)站域名續(xù)費(fèi)一年多少錢
  • 外貿(mào)免費(fèi)開發(fā)網(wǎng)站建設(shè)網(wǎng)絡(luò)廣告營銷方案策劃內(nèi)容
  • 佛山建站專寧波抖音seo搜索優(yōu)化軟件
  • 日文設(shè)計(jì)網(wǎng)站自動點(diǎn)擊器下載
  • 海南??诰W(wǎng)站開發(fā)公司怎么進(jìn)行網(wǎng)站推廣
  • 響應(yīng)式布局網(wǎng)頁seo入門教程視頻
  • 廈門市建設(shè)局網(wǎng)站住房保障2018怎么制作自己的網(wǎng)站
  • 網(wǎng)絡(luò)廣告設(shè)計(jì)案例網(wǎng)站關(guān)鍵詞排名優(yōu)化方法
  • 網(wǎng)站建設(shè)cach目錄營銷策劃培訓(xùn)
  • 自己放題庫做測試網(wǎng)站網(wǎng)絡(luò)營銷產(chǎn)品的首選產(chǎn)品
  • 好的網(wǎng)站和網(wǎng)頁有哪些在線培訓(xùn)網(wǎng)站次要關(guān)鍵詞
  • 無錫h5網(wǎng)站建設(shè)廣州高端網(wǎng)站建設(shè)公司
  • 自己怎么做網(wǎng)站優(yōu)化市場調(diào)研怎么寫
  • 怎樣才能做好網(wǎng)絡(luò)推廣優(yōu)化大師怎么下載
  • 免費(fèi)網(wǎng)站建設(shè)哪個好百度app下載官方免費(fèi)最新版
  • 網(wǎng)站模板如何制作武漢網(wǎng)站競價推廣
  • 公司做網(wǎng)站的 oa辦公系統(tǒng)seo搜索引擎
  • 晚上必看的正能量網(wǎng)站app市場營銷在線課程
  • 東莞市國外網(wǎng)站建設(shè)報(bào)價百度云盤資源搜索
  • 行業(yè)網(wǎng)站cms推廣賺錢
  • wordpress個人博客多大空間seogw
  • 浙江建設(shè)網(wǎng)官方網(wǎng)站西安百度公司開戶
  • 晉城網(wǎng)站建設(shè)重慶的seo服務(wù)公司
  • 模板建站服務(wù)器網(wǎng)站關(guān)鍵詞
  • 商城網(wǎng)站開發(fā)技術(shù)可行性分析廣州疫情最新動態(tài)