Main functions:
// Obtain the void canalysedlg: getnotsame (carray
* Pointarray, int index, int indexs []) {indexs [0] = indexs [1] =-1; int size = pointarray-> getsize (); tabpoint buftpt, TPT; TPT = (tabpoint) pointarray-> getat (INDEX); For (INT I = index; I <size; I ++) {buftpt = (tabpoint) pointarray-> getat (I); If (buftpt. x! = TPT. x) {indexs [0] = I; break;} If (indexs [0] =-1) {for (INT I = 0; I <size; I ++) {buftpt = (tabpoint) pointarray-> getat (I); If (buftpt. x! = TPT. x) {indexs [0] = I; break ;}}for (Int J = index; j> = 0; j --) {buftpt = (tabpoint) pointarray-> getat (j); If (buftpt. x! = TPT. x) {indexs [1] = J; break ;}} if (indexs [1] =-1) {for (Int J = size-1; j> = 0; J --) {buftpt = (tabpoint) pointarray-> getat (j); If (buftpt. x! = TPT. x) {indexs [1] = J; break; }}} if (indexs [0] =-1 | indexs [1] =-1) {MessageBox ("a straight line exists in the region ");}}
// Determine whether the vertex is online
Bool canalysedlg: judgeptinline (tabpoint tpt1, tabpoint tpt2, tabpoint TPT)
{
Double dx1 = getdistance (tpt1, tpt2 );
Double dx2 = getdistance (TPT, tpt1 );
Double dx3 = getdistance (TPT, tpt2 );
Double dx = dx3 + dx2-dx1;
If (dx >=- 0.0000000001 & DX <= 0.0000000001)
{
Return true;
}
Return false;
}
// Obtain the distance between two points
Double canalysedlg: getdistance (tabpoint tpt1, tabpoint tpt2)
{
Double X = tpt1.x-tpt2.x;
If (x <= 0)
{
X =-X;
}
Double Y = tpt1.y-tpt2.y;
If (Y <= 0)
{
Y =-y;
}
Return SQRT (x * x + y * y );
}
// Determine the intersection
// Return value: true: inside the plane; false: Outside the plane
Bool canalysedlg: judgemeetpoint (tabpoint TPT)
{
Int meetpointnum = 0;
// Obtain the number of feature entries
Int featuresize = m_featurearray.getsize ();
For (INT I = 0; I <featuresize; I ++)
{
Feature feature = (feature) m_featurearray.getat (I );
// Obtain the number of feature parts
Int featurepartsize = feature. partsize;
For (Int J = 0; j <featurepartsize; j ++)
{
Featurepart part = (featurepart) feature. partsarray-> getat (j );
Int pointsize = part. pointsize;
For (int K = 1; k
Getat (k-1 );
Tabpoint pt2 = (tabpoint) part. pointarray-> getat (k );
If (TPT. x <= pt1.x & TPT. x> = pt2.x) |
(TPT. x> = pt1.x & TPT. x <= pt2.x ))&&
(TPT. Y> = pt1.y | TPT. Y> = pt2.y ))
{
// Determine whether the vertex is online
If (judgeptinline (pt1, pt2, TPT ))
{
Return true;
}
// Handle special cases where the intersection is the endpoint
Double temp;
// Temp is equivalent to the divisor (denominator of slope)
Temp = pt1.x-pt2.x;
If (temp> =-0.0000000001 & temp <= 0.0000000001)
{
// Process the intersection
Double dx = TPT. X-pt1.x;
If (dx >=- 0.0000000001 & DX <= 0.0000000001)
{
Int indexs [2] = {0, 0 };
Getnotsame (part. pointarray, I, indexs );
Tabpoint linept1, linept2;
Linept1 = part. pointarray-> getat (indexs [0]);
Linept2 = part. pointarray-> getat (indexs [1]);
If (I> indexs [0])
{
Break;
}
Else
{
I = indexs [0] + 1;
}
If (TPT. Y> pt1.y & (TPT. x> = linept1.x & TPT. x <= linept2.x) |
(TPT. x> = linept2.x & TPT. x <= linept1.x )))
Meetpointnum ++;
}
}
Else
{
Double KK, BB;
Double meetpty, meetptx;
Kk = (pt1.y-pt2.y)/(pt1.x-pt2.x );
BB = pt1.y-kk * pt1.x;
Meetpty = KK * TPT. x + BB;
Meetptx = TPT. X;
// Handle special cases where the intersection is the endpoint
Double dx, Dy, dx2, dy2;
DX = meetptx-pt1.x;
DY = meetpty-pt1.y;
Dx2 = meetptx-pt2.x;
Dy2 = meetpty-pt2.y;
If (dx> =-0.0000000001 & DX <= 0.0000000001 & dy> =-0.0000000001
& Dy <= 0.0000000001 ))
{
Tabpoint pt3;
If (k = 1)
{
Pt3 = (tabpoint) part. pointarray-> getat (pointsize-2 );
}
Else
{
Pt3 = (tabpoint) part. pointarray-> getat (K-2 );
}
// Extract the upper and lower points of the intersection point on both sides of the vertical line
If (TPT. Y> meetpty & (meetptx> = pt3.x & meetptx <= pt2.x) |
(Meetptx> = pt2.x & meetptx <= pt3.x )))
Meetpointnum ++;
} Else if (! (Dx2> =-0.0000000001 & dx2 <= 0.0000000001 & dy2> =-0.0000000001
& Dy2 <= 0.0000000001 ))
{
If (TPT. Y> meetpty)
Meetpointnum ++;
}
}
}
}
}
}
If (meetpointnum % 2 = 1)
Return true;
Else
Return false;
}
GIS Navigation Network