#1 Tue 30 November 2010 13:12
- Sylvain PIERRE
- Participant assidu
- Lieu: Strasbourg
- Date d'inscription: 6 Sep 2005
- Messages: 171
Recherche algorithme définition boites englobantes
Bonjour,
Mes données de départ: ensemble d'ilots culturaux appartenant à un agriculteur répartis sur plusieurs communes.
Objectif: sortir des cartes à échelle fixe (1/5000) représentant les différents ilots, sans couper le moindre ilot, sans représenter plusieurs fois un même ilot sur plusieurs cartes
Question: quelle algo doit me permettre de définir le groupes d'ilots représentés sur chaque carte?
d'avance merci
Hors ligne
#2 Thu 02 December 2010 12:25
Re: Recherche algorithme définition boites englobantes
Bonjour,
L'ASP dispose de cet algo:
http://www.asp-public.fr/?q=node/856
Mais je doute qu'ils vous en fassent cadeau.
En revanche, pourquoi pas un deal pour disposer des cadres sur le 67?
Bruno
Dernière modification par Bruno (Thu 02 December 2010 12:49)
Hors ligne
#3 Thu 02 December 2010 15:13
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3224
- Site web
Re: Recherche algorithme définition boites englobantes
Bonjour,
Les conditions à l'origine de votre équation sont difficiles.
Une solution possible une fois connu le format d'impression.
Soit Ei l'encadrante d'un ilot ( ie le rectangle défini par xmin, ymin, xmax, ymax de la polyligne définissant l'ilot)
Quels sont les Ei inclus totalement dans un rectangle d'étendue le format de la carte ?
Puis ilot suivant ...
Un code VB6 définissant une classe (rectangle) que vous pourrez adapter il y a ce qu'il vous faut (union, intersection, est vide ...)
Code:
Option Explicit
Private mLeft As Double
Private mRight As Double
Private mBottom As Double
Private mTop As Double
Private mColor As Long
Public Property Get Color() As Long
Color = mColor
End Property
Public Property Let Color(ByVal Color As Long)
mColor = Color
End Property
Public Property Get Left() As Double
Left = mLeft
End Property
Public Property Let Left(ByVal Left As Double)
mLeft = Left
End Property
Public Property Get Right() As Double
Right = mRight
End Property
Public Property Let Right(ByVal Right As Double)
mRight = Right
End Property
Public Property Get Bottom() As Double
Bottom = mBottom
End Property
Public Property Let Bottom(ByVal Bottom As Double)
mBottom = Bottom
End Property
Public Property Get Top() As Double
Top = mTop
End Property
Public Property Let Top(ByVal Top As Double)
mTop = Top
End Property
Public Function PinRegion(p As Classpoint) As Boolean
If p.x < mLeft Then
PinRegion = False
Exit Function
Else
If p.x > mRight Then
PinRegion = False
Exit Function
Else
If p.y < mBottom Then
PinRegion = False
Exit Function
Else
If p.y > mTop Then
PinRegion = False
Exit Function
Else
PinRegion = True
End If
End If
End If
End If
End Function
Public Function VertexInRegion(p As Vertex) As Boolean
If p.x < mLeft Then
VertexInRegion = False
Exit Function
Else
If p.x > mRight Then
VertexInRegion = False
Exit Function
Else
If p.y < mBottom Then
VertexInRegion = False
Exit Function
Else
If p.y > mTop Then
VertexInRegion = False
Exit Function
Else
VertexInRegion = True
End If
End If
End If
End If
End Function
Public Function rotate(x As Double, y As Double, deltagis As Double)
Dim p(3) As Classpoint
Dim i&
Dim Xmax As Double
Dim Xmin As Double
Dim Ymax As Double
Dim Ymin As Double
For i& = 0 To 3
Set p(i&) = New Classpoint
Select Case i&
Case 0
p(i&).x = mLeft
p(i&).y = mBottom
Case 1
p(i&).x = mLeft
p(i&).y = mTop
Case 2
p(i&).x = mRight
p(i&).y = mTop
Case 3
p(i&).x = mRight
p(i&).y = mBottom
End Select
p(i&).rotate x, y, deltagis
Next i&
Xmin = p(0).x
Ymin = p(0).y
Xmax = p(2).x
Ymax = p(2).y
For i& = 0 To 3
If p(i&).x < Xmin Then
Xmin = p(i&).x
End If
If p(i&).y < Ymin Then
Ymin = p(i&).y
End If
If p(i&).x > Xmax Then
Xmax = p(i&).x
End If
If p(i&).y > Ymax Then
Ymax = p(i&).y
End If
Next i&
mBottom = Ymin
mTop = Ymax
mLeft = Xmin
mRight = Xmax
End Function
Public Function Intersection(r As RealRegion) As RealRegion
Dim Inter As RealRegion
Dim T As Double
Set Inter = New RealRegion
If mLeft < r.Left Then
If mRight < r.Left Then
Inter.Bottom = 0
Inter.Left = 0
Inter.Right = 0
Inter.Top = 0
Set Intersection = Inter
Set Inter = Nothing
Exit Function
Else
If mRight > r.Right Then
Inter.Left = r.Left
Inter.Right = r.Right
Else
Inter.Left = r.Left
Inter.Right = mRight
End If
End If
Else
If mLeft > r.Right Then
Inter.Bottom = 0
Inter.Left = 0
Inter.Right = 0
Inter.Top = 0
Set Intersection = Inter
Set Inter = Nothing
Exit Function
Else
If mRight > r.Right Then
Inter.Left = mLeft
Inter.Right = r.Right
Else
Inter.Left = mLeft
Inter.Right = mRight
End If
End If
End If
If mBottom < r.Bottom Then
If mTop < r.Bottom Then
Inter.Bottom = 0
Inter.Left = 0
Inter.Right = 0
Inter.Top = 0
Set Intersection = Inter
Set Inter = Nothing
Exit Function
Else
If mTop > r.Top Then
Inter.Bottom = r.Bottom
Inter.Top = r.Top
Else
Inter.Bottom = r.Bottom
Inter.Top = mTop
End If
End If
Else
If mBottom > r.Top Then
Inter.Bottom = 0
Inter.Left = 0
Inter.Right = 0
Inter.Top = 0
Set Intersection = Inter
Set Inter = Nothing
Exit Function
Else
If mTop > r.Top Then
Inter.Bottom = mBottom
Inter.Top = r.Top
Else
Inter.Bottom = mBottom
Inter.Top = mTop
End If
End If
End If
Set Intersection = Inter
Set Inter = Nothing
End Function
Public Function clone(r As RealRegion)
r.Bottom = mBottom
r.Left = mLeft
r.Right = mRight
r.Top = mTop
End Function
Public Function EstVide() As Boolean
If mBottom = mTop And mRight = mLeft Then
EstVide = True
Else
EstVide = False
End If
End Function
Public Sub ordonne()
Dim x1 As Double
If mBottom > mTop Then
x1 = mTop
mTop = mBottom
mBottom = x1
End If
If mLeft > mRight Then
x1 = mRight
mRight = mLeft
mLeft = x1
End If
End Sub
Public Function Union(r As RealRegion) As RealRegion
Dim un As RealRegion
Set un = New RealRegion
If mBottom = mTop And mLeft = mRight Then
Set Union = r
Set un = Nothing
Exit Function
End If
If r.Left < mLeft Then
un.Left = r.Left
Else
un.Left = mLeft
End If
If r.Right > mRight Then
un.Right = r.Right
Else
un.Right = mRight
End If
If r.Bottom < mBottom Then
un.Bottom = r.Bottom
Else
un.Bottom = mBottom
End If
If r.Top > mTop Then
un.Top = r.Top
Else
un.Top = mTop
End If
Set Union = un
Set un = Nothing
End Function
Public Function Egale(r As RealRegion) As Boolean
If r.Bottom = mBottom And r.Top = mTop And r.Left = mLeft And r.Right = mRight Then
Egale = True
Else
Egale = False
End If
End Function
Public Function EnvironEgale(r As RealRegion, precision As Integer) As Boolean
Dim i&
i& = 0
If r.Bottom - mBottom < 10 ^ -precision Then
i& = i& + 1
End If
If r.Top - mTop < 10 ^ -precision Then
i& = i& + 1
End If
If r.Left - mLeft < 10 ^ -precision Then
i& = i& + 1
End If
If r.Right - mRight < 10 ^ -precision Then
i& = i& + 1
End If
If i& >= 3 Then
EnvironEgale = True
Else
EnvironEgale = False
End If
End Function
Public Function Milieu() As Classpoint
Dim p As Classpoint
Set p = New Classpoint
p.x = (mRight - mLeft) / 2 + mLeft
p.y = (mTop - mBottom) / 2 + mBottom
Set Milieu = p
Set p = Nothing
End Function
Public Function largeur() As Double
largeur = mRight - mLeft
End Function
Public Function hauteur() As Double
hauteur = mTop - mBottom
End Function
Public Sub Dessine(mdc As metricDC)
mdc.CadreReal mLeft, mBottom, mRight, mTop, RGB(0, 0, 255)
End SubChristophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne


