Ramer-Douglas-Peucker line simplification: Difference between revisions
Content added Content deleted
(Added Wren) |
(Ramer-Douglas-Peucker line simplification en FreeBASIC) |
||
Line 452: | Line 452: | ||
7,9 |
7,9 |
||
9,9</pre> |
9,9</pre> |
||
=={{header|FreeBASIC}}== |
|||
{{trans|Yabasic}} |
|||
<lang freebasic> |
|||
Function DistanciaPerpendicular(tabla() As Double, i As Integer, ini As Integer, fin As Integer) As Double |
|||
Dim As Double dx, dy, mag, pvx, pvy, pvdot, dsx, dsy, ax, ay |
|||
dx = tabla(fin, 1) - tabla(ini, 1) |
|||
dy = tabla(fin, 2) - tabla(ini, 2) |
|||
'Normaliza |
|||
mag = (dx^2 + dy^2)^0.5 |
|||
If mag > 0 Then dx /= mag : dy /= mag |
|||
pvx = tabla(i, 1) - tabla(ini, 1) |
|||
pvy = tabla(i, 2) - tabla(ini, 2) |
|||
'Producto escalado (proyecto pv en dirección normalizada) |
|||
pvdot = dx * pvx + dy * pvy |
|||
'Vector de dirección de línea de escala |
|||
dsx = pvdot * dx |
|||
dsy = pvdot * dy |
|||
'Reste esto de pv |
|||
ax = pvx - dsx |
|||
ay = pvy - dsy |
|||
Return (ax^2 + ay^2)^0.5 |
|||
End Function |
|||
Sub DRDP(ListaDePuntos() As Double, ini As Integer, fin As Integer, epsilon As Double) |
|||
Dim As Double dmax, d |
|||
Dim As Integer indice, i |
|||
' Encuentra el punto con la distancia máxima |
|||
If Ubound(ListaDePuntos) < 2 Then Print "No hay suficientes puntos para simplificar " : Sleep : End |
|||
For i = ini + 1 To fin |
|||
d = DistanciaPerpendicular(ListaDePuntos(), i, ini, fin) |
|||
If d > dmax Then indice = i : dmax = d |
|||
Next |
|||
' Si la distancia máxima es mayor que épsilon, simplifique de forma recursiva |
|||
If dmax > epsilon Then |
|||
ListaDePuntos(indice, 3) = True |
|||
DRDP(ListaDePuntos(), ini, indice, epsilon) |
|||
DRDP(ListaDePuntos(), indice, fin, epsilon) |
|||
End If |
|||
End Sub |
|||
Dim As Double matriz(1 To 10, 1 To 3) |
|||
Data 0, 0, 1, 0.1, 2, -0.1, 3, 5, 4, 6, 5, 7, 6, 8.1, 7, 9, 8, 9, 9, 9 |
|||
For i As Integer = Lbound(matriz) To Ubound(matriz) |
|||
Read matriz(i, 1), matriz(i, 2) |
|||
Next i |
|||
DRDP(matriz(), 1, 10, 1) |
|||
Print "Puntos restantes tras de simplificar:" |
|||
matriz(1, 3) = True : matriz(10, 3) = True |
|||
For i As Integer = Lbound(matriz) To Ubound(matriz) |
|||
If matriz(i, 3) Then Print "(";matriz(i, 1);", "; matriz(i, 2);") "; |
|||
Next i |
|||
Sleep |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
Puntos restantes tras de simplificar: |
|||
( 0, 0) ( 2, -0.1) ( 3, 5) ( 7, 9) ( 9, 9) |
|||
</pre> |
|||
=={{header|Go}}== |
=={{header|Go}}== |