Seite 1 von 1

Routine, die nur Rahmen von Objekten darstellt !?????

Verfasst: 30.07.2005 22:37
von merlin
Hallo!
Ich suche eine lösung, mit der ich aus allen möglichen arten von formen (box, circle, andere abstrakte objekte), nur den border anzeigen lassen kann! Dabei soll es aber möglich sein, die Stärke des borders zu bestimmen!

Ich habe einfach mal ein kleines example geschrieben, um das ganze etwas deutlicher zu machen! (bei dem example mit der box und den circle, könnte man einfach sagen, warum zeichne ich nicht erst ein weißes objekt und dann in schwarz ein kleineres objekt? Frei nach dem motto, so habe ich einen border!

Das mag auch bei den 2 Arten von Objekten OK sein... aber nicht, wenn es abstrakte Objektformen handelt!

Hoffe ich konnte mein Problem halbwegs verständlich schildern! Bin bis jtzt bei google nicht fündig geworden, wie man sowas programmiert! Lediglich 1000 Malprogramme, die soetwas bieten habe ich gefunden ;/

Code: Alles auswählen


InitSprite() : InitKeyboard()
OpenScreen(640,480,32,"")

StartDrawing(ScreenOutput())
  FrontColor(255,255,255)
  DrawingMode(1)
  
  Locate(10,10)
  DrawText("Kennt jemand eine routine, mit der ich aus folgenden 2 Objekten, nur den Rahmen mit")
  Locate(10,30)
  DrawText("Angabe von x Pixelbreite belassen kann?")
  
  Box(120,120,60,60,$FFFFFF)
  Circle(420,120,60,$FFFFFF)
  
  Locate(10,220)
  DrawText("Das Ergebniss könnte z.b. wie folgt aussehen... Border = 10 pixel! Brauche dringend")
  Locate(10,240)
  DrawText("eine solche routine, die mit jeder art von formen zurecht kommt! Jemand eine Idee??")
  
  Box(120,340,60,60,$FFFFFF)
  Box(130,350,40,40,$0)
  Circle(420,340,60,$FFFFFF)
  Circle(420,340,50,$0)
  StopDrawing()
FlipBuffers()

Repeat
   ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End

Verfasst: 30.07.2005 22:41
von Green Snake
hi

naja, du könntest die form zoomen.

wenn du zb einen kreis hast, dann zoomst du den um XY pixel :wink:

es sei denn, du meinst mit abstrakte formen, auch solche, die mehrfarbig sind?
dann gehtz etwas schwerer :allright:

Verfasst: 30.07.2005 23:02
von merlin
Green Snake hat geschrieben:hi

naja, du könntest die form zoomen.

wenn du zb einen kreis hast, dann zoomst du den um XY pixel :wink:

es sei denn, du meinst mit abstrakte formen, auch solche, die mehrfarbig sind?
dann gehtz etwas schwerer :allright:
danke für die schnelle antwort! also die objekte sind alle einfarbig! das mit dem zoomen geht leider nur bei box und circle... stell dir z.b. ein objekt in "S" form vor... mit kurven... da geht zoom leider nicht mehr... ich weiß nur, das fast jedes malprog solch eine Funktion hat... aber wie coden? mhhhh...
trotztdem schonmal danke für schnelle antwort! ;)

Verfasst: 30.07.2005 23:08
von Green Snake
mittels sprite 3d sollte das doch gehen?

wenn du ein bild hast:

Code: Alles auswählen

loadsprite(0,"Pfad",#pb_sprite_texture)
createsprite3d(0,0)

zoomsprite3d(0,wirkung,1)

so muss das mit jedem bild gehen..... :?

Verfasst: 30.07.2005 23:28
von merlin
Green Snake hat geschrieben:mittels sprite 3d sollte das doch gehen?


wenn du ein bild hast:

Code: Alles auswählen

loadsprite(0,"Pfad",#pb_sprite_texture)
createsprite3d(0,0)

zoomsprite3d(0,wirkung,1)

so muss das mit jedem bild gehen..... :?

nein, leider geht das nicht... ergbnisse sind nicht wie gewollt.. hab das auch erst gedacht und dann nochmal drüber nachgedacht... mit zoomen geht das leider nicht... (wäre zu schön gewesen)

Verfasst: 30.07.2005 23:59
von freedimension
Puh, schwieriges Thema. Das müsste eigentlich mit Normalen gehen. D.h. du hast ja den Umrisspfad deines Originalobjektes, und berechnest nun den Normalenvektor jedes Ankerpunktes dieses Pfades. Der Punkt wird dann einfach um eine bestimmte Länge an diesem Vektor verschoben.

Schwierigkeiten dabei:

1. Bei komplexen Formen Überschneidungen rausrechnen, das müsste aber gehen indem du bestimmst ob der neue Punkt bereits innerhalb der neuen Umrisslinie liegt, gegebenenfalls wird Schnittpunkt berechnet.

2. Bestimmung ob Normalenvektor nach Draußen oder Innen zeigt, du müsstest allerdings nur einmal am Anfang rausfinden ob du die Ankerpunkte mit oder gegen den Uhrzeigersinn gezeichnet hast.

Hoffe meine Gedanken tragen zu einem guten Resultat bei :)

Verfasst: 31.07.2005 00:05
von merlin
uiiii.... hört sich etwas abgefahren an :wink:
kann dir zwar nur ansatzweise folgen aber denke, das es für so etwas eine einfache routine gibt...

irgendwie in der art wie...


matrix 3x3 / 5x5 oder sowas!? oder komplett Bildbreite*Bildhöhe!?
und immer eine bestimmte anzahl z.b. 3x3 pixel lesen und vergleichen und
je nach ergebniss punkt weiss oder schwarz setzen... das ist nur theoretisch ein anatz von mir... weiß aber noch nicht, wie ich was zu rechnen habe um das gewünschte ergebniss zu erhalten... (vielleicht lieg ich auch mit diesem weg komplett falsch!?)

kann zumindest nichts so schwieriges sein, da es fast jedes malprog hat!?

Verfasst: 31.07.2005 19:27
von FGK
Hallo Merlin,

ich hab hier mal nen Ansatz mit GDI Path_ gemacht. Ev. ist das ja eine Lösungsmöglichkeit für dich.
Zur kurzen Erklärung:

Zuerst generiere ich einen Path auf dem DC des Windows.
Die Pfade können sehr komplex sein (auch Texte Bezier Polylines usw.)
Dannach generiere ich einen Pen mit Stärke und Farbe und dann wird das ganze einfach mit StrokePath_ ins DC des Windows gezeichnet.
Das schöne daran ist du kannst die komplizierte Figur vorher generieren und nur mit einem Aufruf auf den Bildschirm bringen.

Hoffe das hilft dir etwas weiter

Code: Alles auswählen

If OpenWindow(0, 100, 200, 640,480,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered , "PureBasic Window")
  
  dc=GetDC_(WindowID(0))
  BeginPath_(dc)
    Rectangle_(dc,10,10,110,110)
    Arc_(dc,120,10,220,110,0,90,0,90)
   Pie_(dc,10,250,110,350,0,100,200,100)
 EndPath_(dc)
  
  OldPen=GetCurrentObject_(dc,#OBJ_PEN) 
  NewPen=CreatePen_(#PS_SOLID,10,RGB(0,0,0)) 
  SelectObject_(dc,NewPen) 
  
  Repeat
    EventID.l = WaitWindowEvent()

    StrokePath_(dc)
    
    If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
      
    EndIf
    
  Until Quit = 1
  
EndIf
  DeleteObject_(NewPen) 
  SelectObject_(dc,OldPen) 
 
End 

Gruß

FGK

Thema noch aktuell ???

Verfasst: 09.10.2005 13:26
von PureLust
Hallo Merlin,

ich habe u.A. eine solche Routine für meine 2D-GFX Lib geschrieben.

Daher meine Frage an Dich: Ist das Thema noch aktuell und benötigst Du eine solche Routine noch ???

Greetz, Luke.

Re: Thema noch aktuell ???

Verfasst: 15.10.2005 01:32
von merlin
weiß einer ob Purefan in diesem forum noch aktiv ist oder wie man ihn evtl. per email oder so erreichen kann!?