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

jquery网站模版英国网站后缀

jquery网站模版,英国网站后缀,苏州seo全网营销,互联网宣传推广的基础架构目录 前言 方法一 原理 代码 测试 结果 方法二 原理 一、检查连线与球体的相交情况 二、检查距离与球体半径的关系 三、检查连线与球体的相交 代码 前言 通过数学原理判断空间中任意两点的连线是否穿过球体,再通过射线检测检验算法的正确性。 方法一 …

目录

前言

方法一 

原理

代码

测试

结果

方法二

原理

一、检查连线与球体的相交情况

二、检查距离与球体半径的关系

三、检查连线与球体的相交

代码


前言

       通过数学原理判断空间中任意两点的连线是否穿过球体,再通过射线检测检验算法的正确性。

方法一 

原理

(1)设球体球心的坐标为O(C_{x},C_{y},C_{z}) ,半径为r;

(2)设线段AB中A点的坐标为A(x_{1},y_{1},z_{1}),B点的坐标为B(x_{2},y_{2},z_{2})

(3)计算\underset{OA}{\rightarrow}\underset{OB}{\rightarrow}\underset{AB}{\rightarrow}

(4)计算点O到 线段AB的最短距离d

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

(5) 如果d\leq r,则线段AB穿过球体;如果d> r,则线段AB不穿过球体。

代码

        定义一个函数“IsCrossSphere”来判断线段AB是否穿过球体,函数需要传入点A、B的坐标以及球心坐标和球体半径。

再定义一个结构体作为函数返回值

函数“IsCrossSphere”的实现如下

头文件:

// 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);   //计算线段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中每帧去发射射线检测并调用函数 “IsCrossSphere”,通过观察射线碰撞结果以及函数 “IsCrossSphere”的打印是否相等来判断算法是否有误。(这里设置球体半径固定为50,球体坐标为(0,0,0))

结果

        可以看到不论是线段在球体表面,穿过球体,还是在球体外,函数 “IsCrossSphere”与射线检测的结果都是一致的。

方法二

原理

一、检查连线与球体的相交情况

        使用距离公式计算点 A到球体中心O 的距离d_{A},以及点 B到地球中心O 的距离d_{B},设点AA(x_{1},y_{1},z_{1}),点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}}

二、检查距离与球体半径的关系

        如果 d_{A}\leq R 且 d_{B}\leq R,则两点都在球体内部,它们的连线显然穿过球体;

        如果 d_{A}> R 且 d_{B}> R,则两点都在球体外部,需要进一步检查它们的连线是否与球体相交。

三、检查连线与球体的相交

        当两点都在球体外部时,我们可以计算直线 AB 的参数方程,并尝试找到与球体表面(即半径为 R 的球体)的交点。将直线的参数方程代入球体的方程,并解出一个关于参数的二次方程。如果这个二次方程有实数解,并且解对应的参数值在 0 和 1 之间(对于参数化的线段 AB),则连线与球体相交。

 (1)表示直线参数方程

        对于线段AB的参数方程可以表示为

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是参数,0\leqslant t\leqslant 1表示线段AB上的点

(2)表示球体方程

        设球体球心的坐标为O(C_{x},C_{y},C_{z}) ,半径为R,则球体方程可表示为

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

(3)将直线的参数方程代入球体的方程中,得到一个关于t的二次方程

 

 展开并整理后,可得到一个标准的二次方程形式:at^{2}+bt+c=0

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

(5)如果二次方程没有实数解(\Delta < 0),则直线不与球体相交;

         如果二次方程有一个实数解,并且解在 0≤t≤1 的范围内,则线段 AB 与球体相交于一点;

        如果二次方程有两个不同的实数解,并且至少有一个解在 0≤t≤1 的范围内,则直线段 AB 与球体相交于两点(即线段穿过球体)。

代码

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));  //计算点A到球体中心的距离float D_B = sqrt(pow(pointB.X - sphereOrginPoint.X, 2) + pow(pointB.Y - sphereOrginPoint.Y, 2) + pow(pointB.Z - sphereOrginPoint.Z, 2));  //计算点B到球体中心的距离if (D_A <= sphereRadius && D_B <= sphereRadius)  //两点都在球体内部,它们的连线显然穿过球体{return true;}else if (D_A > sphereRadius && D_B > sphereRadius)  //两点都在球体外部{//将直线的参数方程代入球体的方程,得到标准二次方程的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{// 有两个不同的实数解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 与球体相交于两点}else {return false;  //直线与球体在无限远处相交,即线段没有穿过球体}}else if (discriminant == 0.0f)  //△=0{// 有两个相等的实数解(或说是一个重根)float t = (-1 * b) / (2 * a);if (t >= 0 && t <= 1){return true;  //直线段 AB 与球体相交于一点}else{return false; //虽然直线在无限延伸的情况下会与球体相交,但交点并不在连接点A和点B的线段上,因此没有相交}}else  //△<0{// 没有实数解,直线不与球体相交return false;}}else  //一点在球体内部,另一点在球体外部,则它们的连线一定穿过球体{return true;}
}
http://www.yayakq.cn/news/611981/

相关文章:

  • 网站设计登录界面怎么做企业微信自建应用怎么开发
  • 莆田专门做网站该网站的域名为
  • 湖北襄阳网站建设视觉设计的特点和优势
  • 多语言网站建设费用开发公司工程部管理制度
  • 常熟做网站多少钱wordpress评论去掉邮箱
  • 网站开发的技术分类网站美工怎么做
  • 高端网站特色百度竞价推广代理
  • 网上做网站东湖南昌网站建设公司
  • 网站详细设计报价平台
  • apache 网站建设深圳市建设项目
  • 大连淘宝网站建设手机银行app下载安装
  • 公司网站后如何更新商业网络平台
  • 北京哪家制作网站好wordpress注册系统
  • 新建的网站怎么上首页wordpress 主题 zuopin
  • 网站建设数据库代加工厂找订单的网站
  • dede网站源码打包下载如何做网销
  • 建设阿里巴巴网站网站前端浏览器兼容如何做
  • 打开网站文件夹权限设置网站服务器 免费的吗
  • 广元单页网站制作营销型网站建设与网盟
  • 沈阳网 沈阳网站网站排名优化公司
  • 湛江市住房建设局网站metro风格网站开发
  • 常用的网站都有哪些杭州手机网站开发
  • 长沙有哪些软件公司徐州品牌网站建设|徐州网站优化|徐州网络公司-徐州启思信息科技
  • 怎么修改网站域名武进网站建设多少钱
  • 什么网站比较容易做权重免费商城系统下载
  • 网站建设注册哪类商标建设网站上申请劳务资质吗
  • 网站维护一般需要多久时间有网络但是网页打不开
  • 南宁网站建设gxjzdrj搜狗推广开户
  • 制作公司网站怎么做wordpress判断页面
  • 天津网站建设服务关键字排名优化工具