1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158:
| unit UnitBezier;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
uses OMathGeneral, OMathVector;
function MultiBezier(var Pts: TVector3DArray; var Time: Extended): TVector3D; var PtrCount: Integer; BinomialArr: TExtendedArray; begin asm PUSHAD MOV EDX, DWORD PTR [Pts] MOV EDX, DWORD PTR [EDX] PUSH EDX MOV EDX, DWORD PTR [EDX - $00000004]
DEC EDX
LEA EAX, DWORD PTR [PtrCount] MOV DWORD PTR [EAX], EDX
LEA EDX, DWORD PTR [BinomialArr] CALL BinomialRow
MOV EAX, DWORD PTR [Time] FLD TBYTE PTR [EAX]
MOV EDX, DWORD PTR [BinomialArr] MOV ECX, DWORD PTR [EDX - $00000004] MOV EAX, ECX
FLD1 @@BezierTimeLoop1: FLD TBYTE PTR [EDX] FMUL ST(0), ST(1) FSTP TBYTE PTR [EDX] FMUL ST(0), ST(1) ADD EDX, 10 DEC ECX JNZ @@BezierTimeLoop1 FSTP ST(0)
FLD1 FSUBRP FLD1 @@BezierTimeLoop2: SUB EDX, 10 FLD TBYTE PTR [EDX] FMUL ST(0), ST(1) FSTP TBYTE PTR [EDX] FMUL ST(0), ST(1) DEC EAX JNZ @@BezierTimeLoop2 FSTP ST(0) FSTP ST(0)
POP ESI MOV EDI, DWORD PTR [Result]
PUSH $00000003 @@BezierOuterCoordLoop: MOV EAX, $00000003 SUB EAX, DWORD PTR [ESP] LEA EAX, [EAX+4*EAX] ADD EAX, EAX
MOV ECX, DWORD PTR [ESI-$00000004]
MOV EDX, DWORD PTR [BinomialArr]
FLDZ
@@BezierInnerCoordLoop: FLD TBYTE PTR [ESI+EAX] FLD TBYTE PTR [EDX] FMULP FADDP ADD EAX, 30 ADD EDX, 10 DEC ECX JNZ @@BezierInnerCoordLoop
FSTP TBYTE PTR [EDI] ADD EDI, $0000000A DEC DWORD PTR [ESP] JNZ @@BezierOuterCoordLoop POP EAX
POPAD end;
end;
procedure TForm1.Button1Click(Sender: TObject); var PtsArr: TVector3DArray; T: Extended; I: Integer; V: TVector3D; begin SetLength(PtsArr, 4); PtsArr[0] := Vector3DCreate( 0, 0,0); PtsArr[1] := Vector3DCreate(500,250,0); PtsArr[2] := Vector3DCreate( 0,750,0); PtsArr[3] := Vector3DCreate(250,100,0);
Canvas.MoveTo(0, 0); For I := 0 TO 1000 DO Begin T := I / 1000; V := MultiBezier(PtsArr, T); Canvas.LineTo(Round(V.X), Round(V.Y)); Canvas.Pen.Color := Round(255 * T) * $010101; end; end;
end. |