Värst vad det blivit populärt att mäta sina kunskaper på detta forum.... Hej http://www.pellesoft.nu/upload/JohanDcirkel.zip Härligt Johan D... Hej "Alldeles korrekt lösning"? Finns det en "rätt" lösning till detta? Jag blev ganska nöjd med min, fast jag satt ganska länge med den... Fast största delen av tiden gick åt till att leta rätt på små idiotiska fel =( Hade nog med gårddagens festande att göra... Japp just den högskolan ja... Vi som gått där är ju liasom rätt kända för att vara duktiga på det här med programmering.... Åtminstone många av oss.. Det är en bra skola. Ni är säkert garanterat också duktiga..... Det är vi väl alla på ett eller annat sätt. Nu har jag kommenterat koden lite, hoppas att någon förstår nått iaf, annars är det bara att fråga...Utmaningar!
OK. Här kommer en annan utmaning från mig till de hågade.
Anta att ni har ett formulär... På detta formulär slumpar du ca 200 punkter.
DIN uppgift är att:
Drag en linje mellan de punkter som tillsammans bildar den yttre gränsen för mängden av punkter.
RESULTAT:
Du skall ha ett forulär med en oregelbunden ring där samtliga utslumpade punkter befinner sig på eller innanför ringen.
/Peterh
PS. SvenPon Lösningsförslag till din Radar kommer.....Sv: Utmaningar!
Jag har löst problemmet, Märkligt resultat !
Ni löser förmodligen probet med matematik
Jag tog ett annat grepp API GetPixel.På min 200 mhz
tar det ca 5 sek innan det bli klart.
Tillägg jag gjorde mitt ex i 500 * 500 pixel
Kul tankenöt där gick halva söndag em.
mvh
SvenSv: Utmaningar!
Här är mitt förslag. Om någon är intresserad kan jag kommentera programmet, jag orkade inte det nu... Detta är ju farligt med saker att klura på, jag kan ju inte sluta att tänka förrän jag har löst det ;)
/Johan
PS. SvenPon, min lösning tar 20 ms på 800MHz oavsett storlek på formen ;)Sv: Utmaningar!
Alldeles korrekt lösning och så snabb som den skall vara.
Starta med en slumpvis utvaldpunkt. Leta sedan reda på den punkt vars vinkel till startpunkten är störst. Sedan leta reda på nästa punkt vars vinkel är störts osv tills varvet är fullbordat.
/Peterh
PS. Man skulle nästa kunna tro att du är utbildad på HIG!Sv: Utmaningar!
Undrar vad det var jag åstadkom spektakulärt blev
det i allafall.Det är väl skillnad på sammanbinder
respektive omsluter.Kul var det det j.... snyggt om
man slumpar en sådär 10 20 punkter.
Ha det
SvenSv: Utmaningar!
Jag gjorde nästan som du beskrev, först letade jag upp punkten som var längst åt vänster, om det finns mer än en på samma x-koordinat tas den som är längs ned. Sedan letar jag rätt på den punkt som ligger på lägsta vinkel från y-axeln, då kan det inte finnas någon punkt utanför, när jag sedan har kommit till startpunkten igen är cirkeln fullständig.
/Johan
PS. HIG = Högskolan i Gävle???Sv: Utmaningar!
ca 7500 studenter och jag skulle väl tro att en 1000 av dem studerar något som har med data/datorer att göra... Dom har ca 20 datasalar (kanske) med ungefär 20 datorer i varje... Så det är aldrig frågan om att boka dator 100 dagar för det att man måste ha den.
Här finns dessutom Creative media Lab, Ni har säkert sett en del reklamsnuttar på TV som gjorts av elever härifrån... Ketchup-reklamen exempelvis.... Då en ketchupflaska ritar på en tallrik... Ett fotbollsmål, eller så.. Jag tror även att Ballerina-kex reklamen är animerad av elever från denna kurs. Sv: Utmaningar!
Jag vill ju av naturliga själ bara göra lite reklam för HIG eftersom jag själv gått där..
Dataingenjörsprogrammet 120p
/peterhSv: Utmaningar!
<code>
Private Type Punkt
x As Integer
y As Integer
End Type
Dim SlumpPunkter(0 To 199) As Punkt
Dim Ring() As Punkt
Private Sub Form_Load()
Dim tmp As Integer
Dim LastVinkel As Double
Dim TmpVinkel As Double
Dim TmpVinkel2 As Double
Dim Hittad As Boolean
Randomize
'slumpar ut punkter i en array, inga punkter skapas den sista tiondelen av formens hökd/bredd
For tmp = 0 To UBound(SlumpPunkter)
SlumpPunkter(tmp).x = Rnd * (ScaleWidth * 0.8) + ScaleWidth * 0.1
SlumpPunkter(tmp).y = Rnd * (ScaleHeight * 0.8) + ScaleHeight * 0.1
Next
'ring är en array med koordinaterna till ytterramen
ReDim Ring(0)
'första punkten får kordinaten längst upp åt höger i formen
Ring(0).x = ScaleWidth - 1
Ring(0).y = 0
'en punkt som befinner sig längst åt vänster letas upp
For tmp = 0 To UBound(SlumpPunkter)
If SlumpPunkter(tmp).x <= Ring(0).x Then
Ring(0).x = SlumpPunkter(tmp).x
End If
Next
'letar rätt på den punkten med högst y-koordinat av de som ligger längst åt vänster
For tmp = 0 To UBound(SlumpPunkter)
If SlumpPunkter(tmp).x = Ring(0).x Then
If SlumpPunkter(tmp).y >= Ring(0).y Then
Ring(0).y = SlumpPunkter(tmp).y
End If
End If
Next
'här beräknas ytterpunkterna fram, kan bli lite knivigt att beskriva i ord...
LastVinkel = 0
'loop som går tills den har kommit runt ett varv och hittat startpunkten
While (Not (Ring(0).x = Ring(UBound(Ring)).x And Ring(0).y = Ring(UBound(Ring)).y)) Or UBound(Ring) = 0
TmpVinkel = 360
ReDim Preserve Ring(UBound(Ring) + 1)
'loop letar igenom alla punkter efter den med lägst vinkel
For tmp = 0 To UBound(SlumpPunkter)
TmpVinkel2 = BerVinkel(Ring(UBound(Ring) - 1).x, Ring(UBound(Ring) - 1).y, SlumpPunkter(tmp).x, SlumpPunkter(tmp).y)
If LastVinkel <= TmpVinkel2 And TmpVinkel2 < TmpVinkel Then
'vinkeln som är så liten som möjligt men större än den senaste letas fram
TmpVinkel = TmpVinkel2
Ring(UBound(Ring)).x = SlumpPunkter(tmp).x
Ring(UBound(Ring)).y = SlumpPunkter(tmp).y
End If
Next
LastVinkel = TmpVinkel
Wend
'ritar ut "cirkeln"
For tmp = 0 To UBound(Ring) - 1
Line (Ring(tmp).x, Ring(tmp).y)-(Ring(tmp + 1).x, Ring(tmp + 1).y)
Next
'ritar ut alla punkter i rött
For tmp = 0 To UBound(SlumpPunkter)
Me.PSet (SlumpPunkter(tmp).x, SlumpPunkter(tmp).y), RGB(255, 0, 0)
Next
End Sub
Function BerVinkel(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer) As Double
'funktionen räknar ut vinkeln mellan två punkter i förhållande till y-axeln
Const pi = 3.14159265358979
Dim AvstX As Integer, AvstY As Integer, vinkel As Double
AvstX = x2 - x1
AvstY = y2 - y1
If AvstX = 0 And AvstY = 0 Then
'om det är samma vinkel returneras 360, då kommer punkten ignoreras
vinkel = 360
ElseIf AvstY = 0 Then
If AvstX < 0 Then
vinkel = 270
Else
vinkel = 90
End If
ElseIf AvstX = 0 Then
If AvstY < 0 Then
vinkel = 0
Else
vinkel = 180
End If
ElseIf AvstX > 0 Then
If AvstY < 0 Then
vinkel = Atn(-AvstX / AvstY) * 180 / pi
Else
vinkel = 90 + Atn(AvstY / AvstX) * 180 / pi
End If
Else
If AvstY < 0 Then
vinkel = 270 + Atn(AvstY / AvstX) * 180 / pi
Else
vinkel = 180 + Atn(-AvstX / AvstY) * 180 / pi
End If
End If
BerVinkel = vinkel
End Function
</code>
/Johan