Unity C OpenDRIVE中線條的實現

2021-10-06 07:25:36 字數 3389 閱讀 1426

最近在做地圖相關的專案,研究了一下opendrive,這篇文章主要記錄了opendrive中的幾類線條的實現,分享給大家,希望對大家有所幫助。

opendrive中主要的線條有以下幾種:

直線(line)弧線(arc)螺旋線(spiral)

只要有這三類線條便可以畫出路的引用線(reference line)。先看一下在unity中的效果(所用案例位址):

首先根據opendrive官方文件提供的資料格式,建立出各種線條的類。

文件中所有線條都繼承自geometry,所以我們建立linebase作為基類:

using system.collections;

using system.collections.generic;

using unityengine;

[system.serializable]

public abstract class linebase

public vector3 getpositionats(float s)

protected abstract vector2 calculatepoint(float s);

}

直線很簡單,我們只需要知道起始點座標x、y和heading軸旋轉角度hdg便可以推出在s上的座標:

using system.collections;

using system.collections.generic;

using unityengine;

public class straightline : linebase

protected override vector2 calculatepoint(float s)

}

弧線多了乙個屬性:曲率(curvature),根據曲率便可以畫出乙個弧線:

using system.collections;

using system.collections.generic;

using unityengine;

public class arcline : linebase

protected override vector2 calculatepoint(float s)

}

螺旋線是比較複雜同時也是運用場景非常多的一種曲線,具體介紹可以自行搜尋。

關鍵屬性:curvstart(螺旋線開始的曲率)、curvend(螺旋線結束時的曲率)

using system;

using system.collections;

using system.collections.generic;

using unityengine;

public class spiralline : linebase

system.numerics.complex j1 = new system.numerics.complex(0, 1);

protected override vector2 calculatepoint(float s)

else if (cdot == 0 && curvstart != 0)

else

return new vector2((float)cs.real, (float)cs.imaginary);

}#region

/* s(x) for small x */

static double sn = new double ;

static double sd = ;

/* c(x) for small x */

static double cn = ;

static double cd = ;

/* auxiliary function f(x) */

static double fn = ;

static double fd = ;

/* auxiliary function g(x) */

static double gn = ;

static double gd = ;

static double polevl(double x, double coef, int n)

while (--i > 0);

return ans;

}static double p1evl(double x, double coef, int n)

while (--i > 0);

return ans;

}static void fresnel(double xxa, ref double ssa, ref double cca)

else if (x > 36974.0)

else

if (xxa < 0.0)

cca = cc;

ssa = ss;

}/**

* compute the actual "standard" spiral, starting with curvature 0

* @param s run-length along spiral

* @param cdot first derivative of curvature [1/m2]

* @param x resulting x-coordinate in spirals local co-ordinate system [m]

* @param y resulting y-coordinate in spirals local co-ordinate system [m]

* @param t tangent direction at s [rad]

*/ public static void odrspiral(double s, double cdot, ref double x, ref double y, ref double t)

#endregion

public override string tostring()

y: heading: length: s:", x, y, hdg, length,s);}}

來自:劉一碼的原創

c opencv中線條細化演算法

要達到的效果就是將線條盡量細化成單畫素,按照 上的hilditch演算法試了一下,發現效果不好,於是自己嘗試著寫了一下細化的演算法,基本原理就是從上下左右四個方向向內收縮。1.先是根據中的原則確定了以下16種情況 2.除錯過後發現,迭代次數多了之後,原來連線著的線條會斷開,分析原因如下圖 3.修改了...

牆體分割的線條是什麼 木製裝飾線條的作用

裝修時,都需要用到木製裝飾線條,這種裝飾條能對牆體起到一定的保護作用,還能起到一定的裝飾性,可以提公升居室的美觀性。下面為大家介紹木製裝飾線條有什麼作用及木製裝飾線條選購技巧。木製裝飾線條有什麼作用 1 裝飾作用 具有一定的裝飾性,要是牆角或家具邊角有一些瑕疵 磕碰等,可以用木製裝飾線條遮擋,同時也...

cad怎麼繪製中線 cad繪製中線的方法

cad怎麼繪製中線 cad繪製中線的方法 1.cad中心線一般為點劃線,畫法很簡單,我們先來設定線型。首先開啟cad,點選計入圖層特性管理器。2.在圖層特性管理器中點選線型進行設定。3.在選擇線型中點選載入。4.選擇合適的中心線然後確定。5.在選擇線型中點選選擇剛才載入的點劃線,然後點選確定。6.在...