最近在做地圖相關的專案,研究了一下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.在...