📄 contou.bas
字号:
M1 = -1
For J = 0 To nSJX
If (LB(J) <> -1) Then
C1 = Abs(Xb(I1, 0) - Xb(J, 0))
c2 = Abs(Yb(I1, 0) - Yb(J, 0))
C3 = Abs(Xb(I1, 0) - Xb(J, 1))
C4 = Abs(Yb(I1, 0) - Yb(J, 1))
If (C1 <= 0.0001 And c2 <= 0.0001) Then M1 = M1 + 1
If (C3 <= 0.0001 And C4 <= 0.0001) Then M1 = M1 + 1
End If
Next J
If (M1 = 0) Then
LB(I1) = 0
Else
M1 = -1
For J = 0 To nSJX
If (LB(J) <> -1) Then
C1 = Abs(Xb(I1, 1) - Xb(J, 0))
c2 = Abs(Yb(I1, 1) - Yb(J, 0))
C3 = Abs(Xb(I1, 1) - Xb(J, 1))
C4 = Abs(Yb(I1, 1) - Yb(J, 1))
If (C1 <= 0.0001 And c2 <= 0.0001) Then M1 = M1 + 1
If (C3 <= 0.0001 And C4 <= 0.0001) Then M1 = M1 + 1
End If
Next J
If (M1 = 0) Then
X1 = Xb(I1, 0)
Y1 = Yb(I1, 0)
Xb(I1, 0) = Xb(I1, 1)
Yb(I1, 0) = Yb(I1, 1)
Yb(I1, 1) = Y1
Xb(I1, 1) = X1
LB(I1) = 0
End If
End If
End If
Next I1
'开曲线
Key = 1
I1 = -1
Do
If (Key = 1) Then '开曲线
Do
I1 = I1 + 1
If (I1 >= nSJX) Then '第一个闭曲线
Key = 2
I1 = -1
Exit Do
End If
If (LB(I1) = 0) Then
Key = 1
Exit Do
End If
Loop
End If
If (Key = 2) Then '闭曲线
Do
I1 = I1 + 1
If (I1 >= nSJX) Then
Key = 0
Exit Do
End If
If (LB(I1) = 1) Then
Key = 2
Exit Do
End If
Loop
End If
If (Key = 0) Then Exit Do
'追踪开曲线或闭曲线
LD = 1
DwX(1) = Xb(I1, 0)
DwY(1) = Yb(I1, 0)
Do
For J = 0 To nSJX
If (LB(J) <> -1) Then
If (Abs(DwX(LD) - Xb(J, 0)) < 0.0001 And Abs(DwY(LD) - Yb(J, 0)) < 0.0001) Then
LD = LD + 1
DwX(LD) = Xb(J, 1)
DwY(LD) = Yb(J, 1)
LB(J) = -1
If (LD = nDwXY) Then
Key2 = True
Else
Key2 = False
End If
Exit For
End If
If (Abs(DwX(LD) - Xb(J, 1)) < 0.0001 And Abs(DwY(LD) - Yb(J, 1)) < 0.0001) Then
LD = LD + 1
DwX(LD) = Xb(J, 0)
DwY(LD) = Yb(J, 0)
LB(J) = -1
If (LD = nDwXY) Then
Key2 = True
Else
Key2 = False
End If
Exit For
End If
End If
Key2 = True
Next J
If (Key2 = True) Then Exit Do
Loop
CurForeColor = 0
Call Smooth(value, nDec, S0, Key, 10, LD, DwX, DwY, Zgrid)
Loop
End If
Next mk
'关闭MIFMID文件
Call MIFMID_Close
'把MIFMID文件转换为MapInfo表
Call MIFMID_Tab
'标注等值线
If (mapWinID > 0) Then '标注等值线
MapInfo.Do "Set map redraw off"
MapInfo.Do "Set Map Layer 1 Label Parallel ON Auto ON Overlap OFF Duplicates ON Line None Position Center Center Font MakeFont(""" & "Arial" & """,0, 10,0,16777215 )"
MapInfo.Do "set map redraw on"
End If
Erase BorderX, BorderY
End Sub
Private Sub SJX()
Dim R As Single, RT As Single
Dim J As Integer, K As Integer
Dim A1 As Single, B1 As Single, C1 As Single, Tt As Single
Dim AA As Single, BB As Single, CC As Single, CosC As Single
Dim bCheck As Boolean, bEQBD As Boolean
Dim Ni As Integer, Nj As Integer, Pi As Integer, Pj As Integer, Pk As Integer
Dim M1 As Integer, M2 As Integer
Dim bSJX As Boolean
'边界段数
Dim nBD As Integer
'用于判断边界环是否搜索过
Dim bBD() As Boolean
'用于判断数据点是否在边界环内
Dim bPoint() As Byte
'第i边界起点BD,第i边对应顶点
Dim BD() As Integer, BDij() As Integer
'第i边界的上一节点、下一节点
Dim Nlast As Integer, Nnext As Integer
ReDim ID1(0 To 2 * NContou), ID2(0 To 2 * NContou), ID3(0 To 2 * NContou)
'Begin生成第一个三角形
Pi = 0
'找出距第一点最近的点2
RT = 1E+20
For J = 1 To NContou
R = (Xcontou(J) - Xcontou(Pi)) ^ 2 + (Ycontou(J) - Ycontou(Pi)) ^ 2
If (R < RT) Then
RT = R
Pj = J
End If
Next J
'找出第三点
Tt = 0
For J = 1 To NContou
If (J <> Pj) Then
AA = (Xcontou(Pj) - Xcontou(J)) ^ 2 + (Ycontou(Pj) - Ycontou(J)) ^ 2
BB = (Xcontou(Pi) - Xcontou(J)) ^ 2 + (Ycontou(Pi) - Ycontou(J)) ^ 2
CC = (Xcontou(Pi) - Xcontou(Pj)) ^ 2 + (Ycontou(Pi) - Ycontou(Pj)) ^ 2
CosC = 1# - (AA + BB - CC) / (2# * Sqr(AA * BB))
If (CosC > Tt + 0.00001) Then
Tt = CosC
Pk = J
End If
End If
Next J
nSJX = 0
ID1(nSJX) = Pi
ID2(nSJX) = Pj
ID3(nSJX) = Pk
'End生成第一个三角形
'定义边界环数组
ReDim BD(0 To NContou), BDij(0 To NContou), bBD(0 To NContou), bPoint(0 To NContou)
For J = 0 To NContou
bBD(J) = False
bPoint(J) = 0
Next J
'生成三条边
nBD = 3
BD(1) = Pi
BDij(1) = Pk
bBD(1) = True
BD(2) = Pj
BDij(2) = Pi
bBD(2) = True
BD(3) = Pk
BDij(3) = Pj
bBD(3) = True
bPoint(Pi) = 1
bPoint(Pj) = 1
bPoint(Pk) = 1
Do
Ni = Ni + 1
bEQBD = False
For J = Ni To nBD
If (bBD(J) = True) Then
bEQBD = True
Exit For
End If
Next J
If (bEQBD = False) Then
For J = 1 To Ni - 1
If (bBD(J) = True) Then
bEQBD = True
Exit For
End If
Next J
End If
Ni = J
If (bEQBD = False) Then Exit Do
'第Ni边的终点节点
If (Ni = nBD) Then
Nj = 1
Else
Nj = Ni + 1
End If
'第Ni边的后邻
If (Ni = 1) Then
Nlast = nBD
Else
Nlast = Ni - 1
End If
'第Ni边的前邻
If (Nj = nBD) Then
Nnext = 1
Else
Nnext = Nj + 1
End If
'第Ni边的三个顶点
Pi = BD(Ni)
Pj = BD(Nj)
Pk = BDij(Ni)
'Begin找下一点
bCheck = False
If (Xcontou(Pj) = Xcontou(Pi)) Then
C1 = Xcontou(Pk) - Xcontou(Pi)
Else
A1 = (Ycontou(Pj) - Ycontou(Pi)) / (Xcontou(Pj) - Xcontou(Pi))
B1 = Ycontou(Pj) - A1 * Xcontou(Pj)
C1 = Ycontou(Pk) - Xcontou(Pk) * A1 - B1
End If
If (C1 <= 0#) Then
M1 = -1
Else
M1 = 1
End If
Tt = 0#
For K = 1 To NContou
If (K = Pi Or K = Pj Or bPoint(K) = 2) Then
Else
If (Xcontou(Pj) = Xcontou(Pi)) Then
C1 = Xcontou(K) - Xcontou(Pi)
Else
C1 = Ycontou(K) - Xcontou(K) * A1 - B1
End If
If (C1 <= 0#) Then
M2 = -1
Else
M2 = 1
End If
If (M1 <> M2) Then
AA = (Xcontou(Pj) - Xcontou(K)) ^ 2 + (Ycontou(Pj) - Ycontou(K)) ^ 2
BB = (Xcontou(Pi) - Xcontou(K)) ^ 2 + (Ycontou(Pi) - Ycontou(K)) ^ 2
CC = (Xcontou(Pi) - Xcontou(Pj)) ^ 2 + (Ycontou(Pi) - Ycontou(Pj)) ^ 2
CosC = 1# - (AA + BB - CC) / (2# * Sqr(AA * BB))
If (CosC > Tt + 0.00001) Then
Tt = CosC
Pk = K
bCheck = True
End If
End If
End If
Next K
'End找下一点
If (bCheck = True) Then '找到下一点
bSJX = True
'找前邻、后邻
If (Pk = BD(Nlast)) Then '后邻,删除Pi点
'修改后邻点参数
BDij(Nlast) = Pi
bBD(Nlast) = True
bPoint(Pk) = 1
For J = Ni + 1 To nBD
BD(J - 1) = BD(J)
BDij(J - 1) = BDij(J)
bBD(J - 1) = bBD(J)
Next J
nBD = nBD - 1 '减少一个边
bPoint(Pi) = 2 'Pi点位于圈内
ElseIf (Pk = BD(Nnext)) Then '前邻,删除Pj点
'修改Ni点参数
BDij(Ni) = Pj
bBD(Ni) = True
bPoint(Pk) = 1
For J = Nj + 1 To nBD
BD(J - 1) = BD(J)
BDij(J - 1) = BDij(J)
bBD(J - 1) = bBD(J)
Next J
nBD = nBD - 1 '减少一个边
bPoint(Pj) = 2 'Pj点位于圈内
ElseIf (bPoint(Pk) < 1) Then '下一点不在边界环上,插入Pk点
'修改Ni点参数
BDij(Ni) = Pj
bBD(Ni) = True
bPoint(Pk) = 1
'数据后推
For J = nBD To Ni + 1 Step -1
BD(J + 1) = BD(J)
BDij(J + 1) = BDij(J)
bBD(J + 1) = bBD(J)
Next J
nBD = nBD + 1
'Pk点参数
BD(Ni + 1) = Pk
BDij(Ni + 1) = Pi
bBD(Ni + 1) = True
Ni = Ni + 1
Else
bSJX = False
End If
If (bSJX = True) Then
'生成新三角形
nSJX = nSJX + 1
ID1(nSJX) = Pi
ID2(nSJX) = Pj
ID3(nSJX) = Pk
End If
Else '没找到下一点,该边界不再搜索
bBD(Ni) = False
End If
Loop
'整理边界
nBorder = nBD - 1
ReDim BorderX(0 To nBorder + 1), BorderY(0 To nBorder + 1)
For J = 0 To nBorder
BorderX(J) = Xcontou(BD(J + 1))
BorderY(J) = Ycontou(BD(J + 1))
Next J
BorderX(nBorder + 1) = BorderX(0)
BorderY(nBorder + 1) = BorderY(0)
End Sub
Public Sub PlotContou23()
Dim I As Integer, J As Integer
Dim TableNameT As String
Dim ParValue() As Single, Vn As Integer, S0 As Single, nDec As Integer
Dim StrMax As String
Screen.MousePointer = 11
bPictureMesh = False
TheContouPath = TheInstallPath + "等值线数据\mesh.dat"
TableName = "mesh.dat"
J = InStr(TableName, ".")
TableNameT = Left(TableName, J - 1)
TableName = TableNameT + ".TAB"
Call ReadContouFile(TheContouPath)
Screen.MousePointer = 11
S0 = 5
'设置等值线参数
Call MaxnDec(Vmin, Vmax, nDec, StrMax, FMT)
Vmin = Val(Format(Vmin, FMT))
Vmax = Val(Format(Vmax, FMT))
MsgBox Vmax & " " & Vmin
Vn = 9
Vd = (Vmax - Vmin) / Vn
Vd = Val(Format(Vd, FMT))
ReDim ParValue(0 To Vn)
Call SetContouValue(ParValue)
Call Contou23(ParValue, Vn, S0, nDec)
Erase Xcontou, Ycontou, Zcontou
Erase Zgrid, bZgrid
Erase ID1, ID1, ID3
Erase BorderX, BorderY
Screen.MousePointer = 0
End Sub
'读绘等值线的数据
Public Sub ReadContouFile(TheContouPath As String)
Dim IX As Integer, IY As Integer, II As Long
Dim I As Long
Dim Temp As String, DSAA_DSBB As String * 4, ValueTemp As Single, DouValueTemp As Double
Dim N0 As Long, N As Long
Dim Xt As Single, Yt As Single
Dim XminT As Double, XmaxT As Double, YminT As Double, YmaxT As Double, VminT As Double, VmaxT As Double
Dim bSpace As Boolean
Dim lNX As Long, lNY As Long, xStep As Double, yStep As Double
On Error Resume Next
Open TheContouPath For Binary Access Read Lock Read As #1
Get #1, 1, DSAA_DSBB
Close (1)
If (DSAA_DSBB = "DSAA") Then 'WinSurfer的ASCII格式
DataType = 0
Open TheContouPath For Input As #1
Line Input #1, Temp
Input #1, NX, NY
Input #1, Xmin, Xmax
Input #1, Ymin, Ymax
Input #1, Vmin, Vmax
For IX = 1 To NX
Input #1, ValueTemp
Next IX
Line Input #1, Temp
Close (1)
If (Len(Trim(Temp)) < 1) Then
bSpace = True
Else
bSpace = False
End If
Open TheContouPath For Input As #1
Line Input #1, Temp
Input #1, NX, NY
Input #1, Xmin, Xmax
Input #1, Ymin, Ymax
Input #1, Vmin, Vmax
ReDim Zgrid(1 To NX, 1 To NY), bZgrid(1 To NX, 1 To NY)
N0 = NX * NY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -