【荐】虚拟乾陵 – 永远的经典

那是二零零一年发布的一个Web3D小说。

小说版权由作者李晓晖和博客园共有,若转发请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

页面上提交的牵线:

1.背景

假诺有两条轨道,一条是预订轨道,一条是实在轨迹,分别为L① 、L2。L1由点(A一 、A贰 、A三 、…、AN)组成,L2由(B壹 、B② 、B三 、…、BM)组成。以往交付了一个容差范围,即L2上的点能与L1这条预约路线的垂直容差范围Range,求L2上满足供给的实际点。

这一个供给我们实在能够分为三种境况来设想,一种是此需求单纯的单独是讲求赢得与L1能有一定匹配度的点。不过,假诺大家深切剖析,会发觉L1作为一条线,其自身是有方向性的,假如大家还将线的方向性考虑进来,即L2的点不仅要在与L1的Range范围内,还要此时的点的上进方向与L1是同样的。

理所当然,我们由此AGS只怕吉优Server之类的NA服务是能够实现最邻路径生成的艺术的,那几个措施大家留在作者的从底部谈WebGIS的宏图达成多重中跟大家齐声研商。那里我要跟大家谈谈一种效能更高的法子,直接通过数据库的贮存进程来兑现。

作者在上头提到的三种景况(不考虑方向性和设想方向性),那四头是稀罕递进的。我们率先考虑什么通过不考虑方向性来化解。然后再进一步钻探倘诺有方向性,大家该用什么样思路去完结。

 

2.不考虑方向性的算法实现

课题钻探:采用虚构现实技术演示与回复世界文化遗产

2.1更是简化难题

这里,首先大家将标题更是简化,即什么判定二个点是不是落在四个点组成的线的容差范围内,距离描述为:a点、b点八个陈设点,c点为实际点,以往要看清c点是或不是在a点和b点连接成的直线的容差范围内。

 – 底特律文陵 VR 场景体贴与还原研讨 –

2.2化解简化难题的思路

自作者将消除步骤分为三步。分别为:1.简单判断;2.判断是或不是落在线外;3.垂线判断。

详尽经过就是:

A.粗略判断,c点和a点以及b点的连线是不是在容差范围内,即ac可能bc是还是不是在容差范围内。假如是,再次来到true。不然,进一步判断。

B.判断c点是不是在ab直线的外场,即c点到ab的垂足在ab的延长线上(即便是那种景观,只给贰个容差范围是很难分明是或不是符合标准的,须要八个与容差有关的参数,比如水平容差和垂直容差等,为了简化,此种景况下,直接回到false)。借使垂足在ab上,则展开下一步。

C.算出c点到ab的垂线距离d。判断d是不是在容差范围内,如若在,再次回到true;不然,重回false。

在线虚拟三维多用户网站

2.3兑现判断点是或不是在线范围内(使用存款和储蓄进度)

使用Hellen公式求点到线段的距离。

传递的参数中。x0、y0、x壹 、y1为预定轨道的五个坐标(P0,P1),x② 、y2为第⑤个坐标(实际地方S)的坐标,
fRange为比对距离,return 0 超出,return 1未超过。

 图片 1                    

function getNearestDistance(x0 in number,y0 in number,x1 in
number,y1 in number,x2 in number,y2 in number,fRange in number :=
1,distance out number) return integer is 

    fa number(15,3);

    fb number(15,3);

    fc number(15,3);

    fl number(15,3);

    fs number(15,3);

  begin

    fa := sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

    fb := sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2));

    fc := sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));

    if fa < fRange then –当fa边长度小于警告距离时

      distance := fa;

      return 1;

    end if;

    if fb < fRange then –当fb边长度小于警告距离时

      distance := fb;

      return 1;

    end if;

    if fc < 0.01 then –当轨迹的四个坐标点重合时

      return 0;

    end if;

if(fa*fa>=fb*fb+fc*fc) then  –P0处角度为(钝(直)角),垂足在外 

      distance := fb;

      return 0;

end if;   

if(fb*fb>=fa*fa+fc*fc) then – P1处角度为(钝(直)角),垂足在外  

      distance := fa;

      return 0;

    end if; 

    –利用Hellen公式求垂直距离

    fl := (fa+fb+fc)/2;     –周长的一半    

fs := sqrt(fl*(fl-fa)*(fl-fb)*(fl-fc));
 –Hellen公式求面积,也能够用矢量求    

    distance := 2*fs/fc; 

    if distance < fRance then

      return 1;

    end if;

    return 0;

  end;

虚拟乾陵 – 入选 SIGGRAPH 的 V凯雷德 场景

2.4贯彻整个工艺流程

先查询获得全方位预约路线的坐标,再查询出须要看清的点S,遍历整个预订路线判断S是不是在整个线路的某条线段的容差范围内。

再查询出实际线路中的第②个实际点,重复上边的进度。

第3个经过的落实如下:

 

isOutOfRanceErr := 1;

open rs2 for select a.X,a.Y,b.X,b.Y,c.预先警告距离 from 坐标点表 a,
坐标点表 b, 轨迹表 c where a.轨迹ID=b.轨迹ID  and a.轨迹ID = c.轨迹ID
and a.坐标ID+1=b.坐标ID order by a.轨迹ID,a.坐标ID;

       loop

         Fetch rs2 into fP0X,fP0Y,fP1X,fP1Y,fToleRance;

         Exit when rs%Notfound;

           dummy :=
getNearestDistance(fP0X,fP0Y,fP1X,fP1Y,fCoordinateX,fCoordinateY,fToleRance,fDistance);

           if dummy = 1 then

              isOutOfRanceErr := 0;

              exit;

           end if;

         end loop;

       close rs2; 

 

 

3.设想方向性的算法的落实

设若轨迹的周旋统一还考虑方向性,即线路a-b-c-d与线路a-c-b-d是差异,其实,此时只需求用2个变量来标记每二回吻合时,数组已经比较到的地点,下次对待时应有从标记处初始后推就能促成方向性难题了。

 

                                                                         
 —–欢迎转发,但保留版权,请于鲜明处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                          
若是你认为本文确实扶助了你,能够微信扫一扫,实行小额的打赏和鞭策,谢谢^_^

                                    图片 2

 

从自笔者接触虚拟现实到后来以Web3D为主攻方向,这些小说向来是本身心目标No.1。尤其那首背景音乐

古琴曲《秋水》,现今仍在自个儿耳旁回响。(引:琴音中正醇和,高旷空澈,劲气饱满,余韵激响,空净醇澈,就如道心。取《庄周》篇名,借庄子迷梦蝴蝶的有趣的事,表现法家天人合一的经济学思想。飘逸虚渺的音韵,给人以罗曼蒂克尘滓之感。)

 

设置浏览插件有个步骤,先装用于多用户聊天的 blaxxun
Contact,请到此处下载中文无乱码版
BC,然后下载最新的
BS Contact
VRML/X3D

(原始下载页面:http://www.bitmanagement.de/en/download ) 插件。

设置好之后,就足以访问编造孛儿只斤·元太祖陵
了,网址:http://vr.mingxiaoling.org/。

 

图片 3

 

前段时间那些网站已不知所厝打开,但今天打开后发现其间的场景文件由于位于
bitmanagement
集团服务器恐怕已被删掉,笔者已email给创作小编看好还是倒霉化解那么些标题。