Foro | | | | funkheld | Hallo, Frohe Ostern. Ich brauche bitte einmal Aiuto per die Drehung einer Grafik.
Ich möchte die gedrehte Grafik hier rein bringen: bpic1& = create("hNewPic", 128,128,rgb(0,0,0)) und nicht auf den Bildschirm .
Wie geht das ?
Danke.
Gruss
declare bpic&,ende&,hWin&,winkel&,hDCWin&
ende&=1
bpic& = create("hPic",-1,"auto.bmp")
Window 20,20-400,400
Cls RGB(220,220,220)
hWin& = @Create("text", %hWnd, "", 10,10, 300,300)
hDCWin& = ~GetDC(hWin&)
WHILE ende&
if isKey(81)
winkel&=winkel&-100
cls
drawhPicRotated(bpic&,hDCWin&,100,100,128,128,winkel&,50)
endif
if isKey(69)
winkel&=winkel&+100
cls
drawhPicRotated(bpic&,hDCWin&,100,100,128,128,winkel&,50)
endif
ENDWHILE
end
nProc getCircP(long r,w)
return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))
endproc
nProc angleByLine(long x,y,xx,yy)
sub y,yy
sub x,xx
if x
xx=int(57295.77951 * arctan(float(y)/float(x)))
case x>0 : return 270000 + xx
return 90000 + xx
endif
case y<0 : return 180000
return 0
endproc
nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)
long hDCBits=createCompatibleDC(hDC)
selectObject(hDCBits, hPic)
long pts=dim(24)
long w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
deleteDC(hDCBits)
dispose(pts)
endproc
|
| | | | |
| | | Wenn man einen Trick nutzt das %hDC nach StartPaint auf ein hPic den DC des "hPics" zurückgibt dann so:
{$cleq}
{$compiler c:\xprofan11\}
{$runtime c:\xprofan11\}
declare bpic&,ende&,winkel&
ende&=1
bpic& = create("hPic",-1,"c:\\auto.bmp")
Window 20,20-400,400
Cls RGB(220,220,220)
var bpic1& = create("hNewPic", 128,128,rgb(0,0,0))
WHILE ende&
waitinput 10
startpaint bpic1&
drawhPicRotated(bpic&,hDC,64,64,128,128,winkel&,50)
endpaint
drawpic bpic1&,0,0;0
winkel&=rnd(360000)
ENDWHILE
end
nProc getCircP(long r,w)
return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))
endproc
nProc angleByLine(long x,y,xx,yy)
sub y,yy
sub x,xx
if x
xx=int(57295.77951 * arctan(float(y)/float(x)))
case x>0 : return 270000 + xx
return 90000 + xx
endif
case y<0 : return 180000
return 0
endproc
nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)
long hDCBits=createCompatibleDC(hDC)
selectObject(hDCBits, hPic)
long pts=dim(24)
long w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
deleteDC(hDCBits)
dispose(pts)
endproc
|
| | | | |
| | funkheld | Jup, danke. Das ist Klasse.
Gruss |
| | | | |
| | funkheld | Jup, es klappt wunderbar diese Native nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r) mit XPSE die du erstellst hast.
Mit den Tasten Q/E kann man ein Sprite rotieren und mit den Tasten W/S kann man es bewegen.
In wieweit werden unten die Routinen vom XPSE beschleunigt?
Wie kann man mit der Routine nProc drawhPicRotated eine Drehung machen um einen verlegten Rotate-XY-Punkt? Jetzt dreht es sich ja immer um den Mittelpunkt.
Mit der Variablen "r" in der nProc habe ich jetzt die grösse eingestellt vom Sprite. Aber mir ist noch nicht klar, ob es etwas mit der Grössenveränderung zu tun hat? So ganz habe den Zusammenhang dazu nicht verstanden.
Danke.
Gruss
{$cleq}
{$compiler d:\xprofan11\}
{$runtime d:\xprofan11\}
declare bpic&, bpic1&,ende&,winkel!,hintergrpic&,vordergrpic&
declare x1!,y1!,dx!,dy!
ende&=1
bpic& = create("hPic",-1,"data\\auto.bmp")
Window 20,20-800,600
Cls RGB(220,220,220)
bpic1& = create("hNewPic", 64,64,rgb(0,0,0))
hintergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
vordergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
startpaint hintergrpic&
usebrush 1,rgb(0,128,255)
ellipse 200,200-250,250
endpaint
WHILE ende&
if isKey(87)
y1!=Sin((winkel!/1000)/180.0*pi())*0.2
x1!=Cos((winkel!/1000)/180.0*pi())*0.2
dx!=dx!-x1!
dy!=dy!-y1!
endif
if isKey(83)
y1!=Sin((winkel!/1000)/180.0*pi())*0.2
x1!=Cos((winkel!/1000)/180.0*pi())*0.2
dx!=dx!+x1!
dy!=dy!+y1!
endif
if isKey(81)
winkel!=winkel!-500
startpaint bpic1&
drawhPicRotated(bpic&,hDC,32,32,128,128,winkel!,30)
endpaint
endif
if isKey(69)
winkel!=winkel!+500
startpaint bpic1&
drawhPicRotated(bpic&,hDC,32,32,128,128,winkel!,30)
endpaint
endif
startpaint vordergrpic&
drawpic hintergrpic&,0,0;0
drawpic bpic1&,100+dx!,100+dy!;-1
endpaint
drawpic vordergrpic&,10,10;0
ENDWHILE
end
nProc getCircP(long r,w)
return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))
endproc
nProc angleByLine(long x,y,xx,yy)
sub y,yy
sub x,xx
if x
xx=int(57295.77951 * arctan(float(y)/float(x)))
case x>0 : return 270000 + xx
return 90000 + xx
endif
case y<0 : return 180000
return 0
endproc
nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)
long hDCBits=createCompatibleDC(hDC)
selectObject(hDCBits, hPic)
long pts=dim(24)
long w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
deleteDC(hDCBits)
dispose(pts)
endproc
|
| | | | |
| | | Hi!
funkheld (10.04.12)
Jup, es klappt wunderbar diese Native nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r) mit XPSE die du erstellst hast.
Ja, danke!
funkheld (10.04.12)
In wieweit werden unten die Routinen vom XPSE beschleunigt?
Meinst Du dies hier ( [...] ) ?
"NProc-Funktionen werden in Assembler umgewandelt, um Hooks, Subclassing,
Threads, Callbacks und all die Dinge zu programmieren, bei denen es auf
Threadsicherheit und hohe Geschwindigkeit ankommt."
Zudem werden die Funktionsaufrufe von XPSE in direkte Calls konvertiert -
diese Funktionsaufrufe sind imho die schnellsten überhaupt.
funkheld (10.04.12)
Wie kann man mit der Routine nProc drawhPicRotated eine Drehung machen um einen verlegten Rotate-XY-Punkt? Jetzt dreht es sich ja immer um den Mittelpunkt.
Dies ist bewusst nicht die Aufgabe dieser Funktion da sie sonst um einige
Operationen größer (und damit auch weniger schnell) würde, die wiederum
nicht immer verwendet würden. Deshalb dreht diese Funktion immer genau um
den Mittelpunkt. Dadurch wiederum aber erst kann man den Punkt um den
gedreht werden soll selbst bestimmen z.B. circa 2 Wege:
a) das Bild gleich so anlegen das der Drehpunkt der richtige ist z.B. durch
Platzlassen bzw. Randhinzufügen
b) die Ausgabeposition (3. und 4. Parameter (x,y)) selbst bestimmen und versetzen
z.B. mit der Funktion getCircP.
funkheld (10.04.12)
Mit der Variablen "r" in der nProc habe ich jetzt die grösse eingestellt vom Sprite. Aber mir ist noch nicht klar, ob es etwas mit der Grössenveränderung zu tun hat? So ganz habe den Zusammenhang dazu nicht verstanden.
Du kannst damit den Radius bzw. die Ausgabegröße des gedrehten Bildes
bestimmen und damit ist die Funktion quasi auch gleich drawhPicRotatedAndSized.
Wenn Du il valore 0 übergibst dann ermittelt die Funktion die Ausgabegröße
die per dieses Bild normal wäre bzw. die "Originalgröße". |
| | | | |
| | | Mach doch eher so:
'URL: https://xprofan.com/intl/de/forum/hallo-if-drehung-einer-grafik-mit-xpse-nicht-auf-den-screen-native-nproc/#n
{$cleq}
{$compiler c:\xprofan11\}
{$runtime c:\xprofan11\}
declare bpic&, ende&,winkel!,hintergrpic&,vordergrpic&
declare x1!,y1!,dx!,dy!,spd!
ende&=1
bpic& = create("hPic",-1,"data\\auto.bmp")
Window 20,20-800,600
Cls RGB(220,220,220)
hintergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
vordergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
startpaint hintergrpic&
usebrush 1,rgb(0,128,255)
ellipse 200,200-250,250
endpaint
dx!=100
dy!=100
spd!=1
WHILE ende&
sleep 16
if isKey(38)
spd!=spd!+0.1
endif
if isKey(40)
spd!=spd!-0.1
endif
if isKey(37)
winkel!=winkel!-5000
endif
if isKey(39)
winkel!=winkel!+5000
endif
y1!=Sin((winkel!/1000)/180.0*pi())*spd!
x1!=Cos((winkel!/1000)/180.0*pi())*spd!
dx!=dx!-x1!
dy!=dy!-y1!
startpaint vordergrpic&
drawpic hintergrpic&,0,0;0
drawhPicRotatedTransparent(bpic&,hDC,int(dx!)-getCircP(15,int(winkel!)+90000),int(dy!)+getCircP(15,int(-winkel!)),128,128,winkel!,30,0)
endpaint
drawpic vordergrpic&,10,10;0
ENDWHILE
end
nProc getCircP(long r,w)
return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))
endproc
nProc angleByLine(long x,y,xx,yy)
sub y,yy
sub x,xx
if x
xx=int(57295.77951 * arctan(float(y)/float(x)))
case x>0 : return 270000 + xx
return 90000 + xx
endif
case y<0 : return 180000
return 0
endproc
nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)
long hDCBits=createCompatibleDC(hDC)
selectObject(hDCBits, hPic)
long pts=dim(24)
long w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
deleteDC(hDCBits)
dispose(pts)
endproc
nProc drawhPicRotatedTransparent(long hPic,dc,x,y,xx,yy,w,r,col){
long hDCBits=createCompatibleDC(hDC)
selectObject(hDCBits, hPic)
long pts=dim(24)
long w1=angleByLine(xx,yy,0,0),\
w2=abs(w1-360000),\
w3=abs(w1-540000)
casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
long r2=r*2
long pts&,0= r+getcircp(r,w1+w),r+getcircp(r,w1-90000+w),\
r+getcircp(r,w2+w),r+getcircp(r,w2-90000+w),\
r+getcircp(r,w3+w),r+getcircp(r,w3-90000+w)
long mDC=CreateCompatibleDC(hDC)
long memBM=CreateCompatibleBitmap(hDC,r2,r2)
long oldSel=SelectObject(mDC,memBM)
plgBlt(mDC,pts,hDCBits,0,0,xx,yy,0,0,0)
selectobject(dc,memBM)
transparentBlt(dc,x-r,y-r,r2,r2,mDC,0,0,r2,r2,col)
selectObject(mDC,oldSel)
deleteObject(memBM)
deleteDC(mDC)
deleteDC(hDCBits)
dispose(pts)
}
|
| | | | |
| | funkheld | Jup, danke per dein Vorschlag. Klappt vorzüglich.
Gruss |
| | | | |
| | | Die Lenkung vielleicht ansatzweise so:
'URL: https://xprofan.com/intl/de/forum/hallo-if-drehung-einer-grafik-mit-xpse-nicht-auf-den-screen-native-nproc/#n
{$cleq}
{$compiler c:\xprofan11\}
{$runtime c:\xprofan11\}
declare bpic&, ende&,winkel!,hintergrpic&,vordergrpic&
declare x1!,y1!,dx!,dy!,spd!,steerspd!
ende&=1
bpic& = create("hPic",-1,"data\\auto.bmp")
Window 20,20-800,600
Cls RGB(220,220,220)
hintergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
vordergrpic& = create("hNewPic", 500,500,rgb(255,255,0))
startpaint hintergrpic&
usebrush 1,rgb(0,128,255)
ellipse 200,200-250,250
endpaint
dx!=100
dy!=100
spd!=1
steerspd!=0
winkel!=180000
WHILE ende&
sleep 16
if isKey(38)
spd!=spd!+0.1
endif
if isKey(40)
spd!=spd!-0.1
endif
if isKey(37)
steerspd!=steerspd!-0.1
case steerspd!<-2 : steerspd!=-2
endif
if isKey(39)
steerspd!=steerspd!+0.1
case steerspd!>2 : steerspd!=2
endif
winkel!=winkel!+steerspd!*spd!*450
steerspd!=steerspd!*0.95
y1!=Sin((winkel!/1000)/180.0*pi())*spd!
x1!=Cos((winkel!/1000)/180.0*pi())*spd!
dx!=dx!-x1!
dy!=dy!-y1!
startpaint vordergrpic&
drawpic hintergrpic&,0,0;0
drawhPicRotatedTransparent(bpic&,hDC,int(dx!)-getCircP(15,int(winkel!)+90000),int(dy!)+getCircP(15,int(-winkel!)),128,128,winkel!,30,0)
endpaint
drawpic vordergrpic&,10,10;0
ENDWHILE
end
nProc getCircP(long r,w)
return long(sin(0.0174532925199433*float(w)/1000.0)*float(r))
endproc
nProc angleByLine(long x,y,xx,yy)
sub y,yy
sub x,xx
if x
xx=int(57295.77951 * arctan(float(y)/float(x)))
case x>0 : return 270000 + xx
return 90000 + xx
endif
case y<0 : return 180000
return 0
endproc
nProc drawhPicRotated(long hPic,dc,x,y,xx,yy,w,r)
long hDCBits=createCompatibleDC(hDC)
selectObject(hDCBits, hPic)
long pts=dim(24)
long w1=angleByLine(xx,yy,0,0),w2=abs(w1-360000),w3=abs(w1-540000)
casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
long pts&,0=x+getcircp(r,w1+w),y+getcircp(r,w1-90000+w),x+getcircp(r,w2+w),y+getcircp(r,w2-90000+w),x+getcircp(r,w3+w),y+getcircp(r,w3-90000+w)
plgBlt(dc,pts,hDCBits,0,0,xx,yy,0,0,0)
deleteDC(hDCBits)
dispose(pts)
endproc
nProc drawhPicRotatedTransparent(long hPic,dc,x,y,xx,yy,w,r,col){
long hDCBits=createCompatibleDC(hDC)
selectObject(hDCBits, hPic)
long pts=dim(24)
long w1=angleByLine(xx,yy,0,0),\
w2=abs(w1-360000),\
w3=abs(w1-540000)
casenot r : r=long(sqrt(float(xx*xx+yy*yy)))\2
long r2=r*2
long pts&,0= r+getcircp(r,w1+w),r+getcircp(r,w1-90000+w),\
r+getcircp(r,w2+w),r+getcircp(r,w2-90000+w),\
r+getcircp(r,w3+w),r+getcircp(r,w3-90000+w)
long mDC=CreateCompatibleDC(hDC)
long memBM=CreateCompatibleBitmap(hDC,r2,r2)
long oldSel=SelectObject(mDC,memBM)
plgBlt(mDC,pts,hDCBits,0,0,xx,yy,0,0,0)
selectobject(dc,memBM)
transparentBlt(dc,x-r,y-r,r2,r2,mDC,0,0,r2,r2,col)
selectObject(mDC,oldSel)
deleteObject(memBM)
deleteDC(mDC)
deleteDC(hDCBits)
dispose(pts)
}
Fliehkraft fehlt da aber auch noch. |
| | | | |
| | funkheld | Jup, das schaut gut aus und ohne viel Aufwand, nur mit deinen nativen Proceduren. In der Bewegung sieht man die Mächtigkeit der Proceduren...
Danke.
Gruss |
| | | | |
|
AnswerTopic-Options | 10.473 Views |
ThemeninformationenDieses Thema hat 2 subscriber: |