Das nächste Entwicklertreffen findet Anfang Mai in Münster statt - weitere Infos bzw. zur Anmeldung!

welche GDI Function macht mir ein Trapez mit Fluchtpunkt. [erledigt]

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11601
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

welche GDI Function macht mir ein Trapez mit Fluchtpunkt. [erledigt]

Beitrag von AUGE_OHR » Do, 13. Dez 2018 6:20

moin,

Ich hatte es irgendwann mal unabsichtlich aber erinnere nicht mehr die GDI API Function :(

ich habe ein Fenster und will es so "kippen"

Code: Alles auswählen

      ------------------
     /                  \
    /                    \
   /                      \
   ------------------------
wer kennt die GDI Function :?:
Zuletzt geändert von AUGE_OHR am So, 16. Dez 2018 3:03, insgesamt 1-mal geändert.
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von mikehoffmann » Do, 13. Dez 2018 7:59

Polygon.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11601
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von AUGE_OHR » Do, 13. Dez 2018 8:18

moin,
mikehoffmann hat geschrieben:
Do, 13. Dez 2018 7:59
Polygon.
Danke für die Antwort aber ich möchte ein ganzes Fenster / Bitmap damit "bearbeiten"

ich glaube ich hab die Function gefunden : PlgBlt

es geht mit 3 Koordinaten Paar und deren Vertex.
bei einer 1:1 Ansicht (0,0 unten links) hätte man diese 3 Paare

Code: Alles auswählen

    RETURN DrawPlgBlt(oSource,aPos,aSize,oSource,;
           {{aPos[1],aPos[2]},;
            {aPos[1]+aSize[1],aPos[2]},;
            {aPos[1],aPos[2]+aSize[2]}})
https://docs.microsoft.com/en-us/window ... gdi-plgblt
The fourth vertex of the parallelogram (D) is defined by treating the first three points (A, B, and C ) as vectors and computing

Code: Alles auswählen

   D = B +CA
em ... äh ... und wie komme ich jetzt an das Trapez :?:
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11601
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von AUGE_OHR » Do, 13. Dez 2018 8:52

also ich bekomme mit PlgBlt nur ein Parallelogramm raus :(
.
KB_Parallelogramm.jpg
KB_Parallelogramm.jpg (126.45 KiB) 949 mal betrachtet
ich kann es zwar weiter "drehen" und "zerren" aber es bleibt ein Parallelogramm :banghead:
gruss by OHR
Jimmy

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7405
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von Tom » Do, 13. Dez 2018 9:11

also ich bekomme mit PlgBlt nur ein Parallelogramm raus
Und es sieht auch noch scheiße aus. 8)
Herzlich,
Tom

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11601
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von AUGE_OHR » Fr, 14. Dez 2018 6:24

hi Tom,
Tom hat geschrieben:
Do, 13. Dez 2018 9:11
Und es sieht auch noch scheiße aus. 8)
das Verzerrungen mit GDI nicht gut aussehen war mir schon klar.
wenn man nun viele solche GDI Befehle in kleinen Schritten ausführt erhält man eine Animation ... :idea:

ich habe in Richtung GDI weiter gesucht aber das Trapez Problem ist wohl nicht neu ... auch andere hatten die Idee :)
mit GDIplus würde es wohl gehen aber das wäre in DOT Net

dann hab ich was gelesen was zwar (extrem) langsam ist aber im Prinzip funktioniert : jeden Pixel lesen / setzen

Code: Alles auswählen

   FOR nY := 1 TO nYSize
      FOR nX := 1 TO nXSize
         nPixel := GetPixel(nHDC2,nX-1,nY-1)

         xPos := nX + ( ??? )
         SetPixelV(nHDC2,xPos,nY,nPixel)
      NEXT
   NEXT
da ein Trapez entstehen soll ist also die X-Position beim setzen "anders" als im Original.

ein Beispiel das ich gefunden habe hatte diese "Formel"

Code: Alles auswählen

  for y:=0 to Hoehe do
    for x:=0 to Breite do
      begin
        links:=dxOben-Round(Faktor1*y);
        Faktor2:=(Breite-2*links)/Breite;
        Farbe:=Image1.Canvas.Pixels[links+Round(x*Faktor2),y];
        Image2.Canvas.Pixels[x,y]:=Farbe;
      end;
GetSet_Pixel.jpg
GetSet_Pixel.jpg (208.88 KiB) 896 mal betrachtet
das ist aber nicht die Optik die ich haben möchte ... unabhängig von der Qualität.
wer kann mir bei der "Formel" weiter helfen, Danke

anbei Source
Dateianhänge
TRAPEZ01.ZIP
Source "pure" Xbase++
(68.95 KiB) 9-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von mikehoffmann » Fr, 14. Dez 2018 10:44

DirectX, GDI+ und OpenGL benötigen kein Punktnetz. Da geht das um Volldampf voraus.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7405
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von Tom » Fr, 14. Dez 2018 11:11

Und noch edler und einfacher geht's mit HTML und CSS. :wink:
Herzlich,
Tom

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11601
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von AUGE_OHR » Sa, 15. Dez 2018 0:19

hi,

wenn Xbase++ das könnte worüber ihr redet würde ich es verwenden ...
bei vielen Aufgaben geht es ja zunächst darum rauszubekommen "wie" etwas funktioniert ... optimieren kann man immer noch.

das auslesen/setzen von einzelnen Pixel dauert zu lange für einen Live Einsatz.
es gibt das Xbase++ Demo \SOURCE\samples\basics\DBBMP\ANIMATE.EXE wo die Bilder "vorbereitet" sind

---

ich habe an der "Formel" weiter gearbeitet und bekomme nun (fast) die gewünschte Trapez Form

Code: Alles auswählen

FUNCTION TT2(nX,nY,nZ,nXSize,nYSize)
LOCAL links   := 0
LOCAL Faktor1 := nZ/20*-1
LOCAL Faktor2 := nZ/20*-1
LOCAL dxOben  := nZ/20*-1   // hm ...
LOCAL xPos    := 0

   links    := dxOben-Round(Faktor1*(nYSize-ny),0)
   Faktor2  := (nXSize-2*links)/nXSize
   xPos     := links+Round(nx*Faktor2,0)

RETURN xPos
für die beiden Faktoren benötigt man Negative Werte um so eine Form zu erhalten
KEYKIP04.JPG
KEYKIP04.JPG (118.14 KiB) 825 mal betrachtet
soweit so gut aber am Ende läuft er auf einen Fluchtpunkt zu der "oben" am Rand liegt ...
KEYKIP30.JPG
KEYKIP30.JPG (85.68 KiB) 825 mal betrachtet
ich möchte bis zum Bottom also Höhe "null" ... da fehlt was in der "Formel" ... :-k
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11601
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von AUGE_OHR » Sa, 15. Dez 2018 13:24

hab jetzt die Bewegung ... aber auch nicht ganz das was ich möchte :^o

ich möchte das oben die Trapez Form entsteht (funktioniert) und das es dann schmäler wird von der Höhe.
nun klebt er am oberen Ende und er wandert von unten nach oben und wird dabei schmäler ... :banghead:
KEYKIP10.JPG
KEYKIP10.JPG (93.34 KiB) 799 mal betrachtet
KEYKIP20.JPG
KEYKIP20.JPG (54.31 KiB) 799 mal betrachtet
---
neue Idee :idea:

wenn ich das Bild nun in ein neues Bitmap transferiere und es dabei auf den unten Rand setze ...
leider macht der Code nicht das was ich dachte ... wieso ?

Code: Alles auswählen

FUNCTION BMP2part( oBMP, i ,iMax)
LOCAL oPS := XBPPRESSPACE() :new() :Create()
LOCAL oTiny := XBPBITMAP() :New() :Create()
LOCAL aSize := {oBMP:xSize,oBMP:ySize}
LOCAL nSteps := aSize[2]/iMax

   oTiny:Make( aSize[ 1 ], aSize[ 2 ], oBMP:planes, oBMP:bits )
   oTiny:presSpace( oPS )
   oBMP:Draw( oPS, { 0,         0  , aSize[ 1 ], aSize[ 2 ] },;
                   { 0, nSteps*(i) , aSize[ 1 ], aSize[ 2 ] },, GRA_BLT_BBO_IGNORE )
RETURN oTiny

FUNCTION MachAufZu(lAufZu,iMax,ostat1,oPb1,oPb2,oBMP)
LOCAL i,cFile, oPart
   IF lAufZu = "ZU"
      oPb1:Disable()
      FOR i := 1 TO iMax
         oBMP:Load(, i+999, "JPG" )
         oPart := BMP2part( oBMP, i ,iMax)
         ostat1:SetCaption(oPart)
      NEXT
      oPb2:Enable()
   ELSE
      oPb2:Disable()
      FOR i := iMax TO 1 STEP -1
         oBMP:Load(, i+999, "JPG" )
         oPart := BMP2part( oBMP, i ,iMax)
         ostat1:SetCaption(oPart)
      NEXT
      oPb1:Enable()
   ENDIF
RETURN NIL
gruss by OHR
Jimmy

Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2445
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von Wolfgang Ciriack » Sa, 15. Dez 2018 18:52

KEYKIP30.JPG erinnert mich irgendwie an Star Wars....
Viele Grüße
Wolfgang

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von mikehoffmann » Sa, 15. Dez 2018 20:27

Ja, war das nicht Episode 4712: Auf der Suche nach Ge-De-I-Ritter.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11601
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt.

Beitrag von AUGE_OHR » So, 16. Dez 2018 1:35

Wolfgang Ciriack hat geschrieben:
Sa, 15. Dez 2018 18:52
KEYKIP30.JPG erinnert mich irgendwie an Star Wars....
schon witzig wie man manchmal auf Ideen kommt ;)

JA, als ich das OSK programmiert habe hatte ich einen Star Wars Vilm vorher gesehen und dachte mir ...
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11601
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt. [erledigt]

Beitrag von AUGE_OHR » So, 16. Dez 2018 3:06

so jetzt hab ich es wie gedacht

Code: Alles auswählen

   // vorher Bitmap auffüllen
   aAAttr[GRA_AA_COLOR] := XBPSYSCLR_DIALOGBACKGROUND
   GraSetAttrArea(oPS, aAAttr )
   GraBox(oPS, {0,0}, {aSize[1],aSize[2]},GRA_FILL  )
   // das ganze nach unten verschieben
   oBMP:Draw( oPS, { 0, 0, aSize[ 1 ], aSize[ 2 ]-((nSteps*i)*1) },;
                   { 0, (nSteps*i)*-1, aSize[ 1 ], aSize[ 2 ]-((nSteps*i)*1) },, GRA_BLT_BBO_IGNORE )
anbei Source / Resource als Demo
Dateianhänge
FlyKey.zip
(1.99 MiB) 18-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
Hans Zethofer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 256
Registriert: Fr, 27. Jan 2006 8:29
Wohnort: 2700 Wiener Neustadt
Kontaktdaten:

Re: welche GDI Function macht mir ein Trapez mit Fluchtpunkt. [erledigt]

Beitrag von Hans Zethofer » Mi, 19. Dez 2018 9:18

=D> =D> =D>
_____________
lg
Hans

Antworten