├── LICENSE ├── README.md ├── TsSource ├── Algorithms.ts ├── Capsule.ts ├── Circle.ts ├── Convex.ts ├── Coordinate.ts ├── Framework.ts ├── Polygon.ts ├── Raycast.ts ├── ShowCase_AddConvex.ts ├── ShowCase_EPA.ts ├── ShowCase_GJK.ts ├── ShowCase_GJKRaycast.ts ├── ShowCase_MinkowskiDiff.ts ├── ShowCase_Paint.ts ├── Simplex.ts ├── SimplexVertex.ts ├── Utils.ts ├── Vertex.ts ├── main.ts ├── package-lock.json ├── test.ts ├── tsconfig.json └── vec2.ts ├── build ├── Algorithms.js ├── Algorithms.js.map ├── Capsule.js ├── Capsule.js.map ├── Circle.js ├── Circle.js.map ├── Convex.js ├── Convex.js.map ├── Coordinate.js ├── Coordinate.js.map ├── Framework.js ├── Framework.js.map ├── Polygon.js ├── Polygon.js.map ├── Raycast.js ├── Raycast.js.map ├── ShowCase_AddConvex.js ├── ShowCase_AddConvex.js.map ├── ShowCase_EPA.js ├── ShowCase_EPA.js.map ├── ShowCase_GJK.js ├── ShowCase_GJK.js.map ├── ShowCase_GJKRaycast.js ├── ShowCase_GJKRaycast.js.map ├── ShowCase_MinkowskiDiff.js ├── ShowCase_MinkowskiDiff.js.map ├── ShowCase_Paint.js ├── ShowCase_Paint.js.map ├── Simplex.js ├── Simplex.js.map ├── SimplexVertex.js ├── SimplexVertex.js.map ├── Utils.js ├── Utils.js.map ├── Vertex.js ├── Vertex.js.map ├── main.js ├── main.js.map ├── test.js ├── test.js.map ├── vec2.js └── vec2.js.map └── index.html /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Introduction介绍:

3 | 4 | It's a GJK based 2D collision test tutorial demo. 5 | Including common collision test and CCD(continuous collision detection). 6 | 7 | 这是一个基于GJK的2D碰撞演示demo。 8 | 包含了普通的碰撞检测和CCD(连续碰撞检测)。 9 | 10 | # Prerequisite准备:

11 | 12 | 1. Install the latest stable version of Node.js. 13 | 2. Execute "npm install -g typescript" to install typescript compiler on your computer. 14 | 15 | 1. 安装最新版本的Node.js。 16 | 2. 执行 "npm install -g typescript" 来安装typescript的支持。 17 | 18 | # Build编译:

19 | All the source code is located in "TsSource" folder. 20 | Please execute "tsc" command in the "TsSource" folder to compile source files after you've modified it. 21 | 22 | 所有的typescript源代码都放在"TsSource"目录下。 23 | 当您修改了源代码之后,需要在命令行下进入"TsSource"目录,并且执行"tsc"指令来编译源代码。 24 | 25 | # Run运行:

26 | Open "index.html" by web browser to see the effect. Chrome is the suggested web browser to open it. 27 | 28 | 打开"index.html"即可运行Demo。推荐使用Chrome浏览器。 29 | 30 | 31 | 32 | # How to use demo 怎样使用demo:

33 | This Demo need 2 convex objects to do the collision detect. There are already 2 triangles when you open this demo. If you want to modify it, you can clear all the convex objects by clicking the "Clear All Convex Objects" button. 34 | And then, you can choose the type of convex object in the drop down selector. 35 | Currently, this demo support 3 types of convex, Polygon, Circle and Capsule. you can begin to add it by clicking the "Begin Add Convex" button, and click the "Cancel Add Convex" button to cancel adding new convex object. Finaly, when you click the "Finish Add Convex" Button, the new convex will be added.(This button is needed only for Polygon, when Circle and Capsule can be added automatically) 36 | You can drag the convex Object by Middle Mouse Button, and scale the coordinate by Mouse Wheel. 37 | 1. When the convex type is Polygon, every time when you clicking the Left Mouse Button, a new Vertex will be added, and you can delete the last one by clicking Right Mouse Button. After all the vertices are added, you can click the "Finish Add Convex" button to complete this action. 38 | 2. When the convex type is Circle, the first time you clicking the Left Mouse Button is to configure the center of the circle, and you can move your cursor to adjust the radius. Finally, click Left Mouse Button again to finish your action. 39 | 3. When the convex type is Capsule, the first and second times you cliking the Left Mouse Button is to configure the P0 and P1 points of the Capsule, and you can move your cursor to adjust the radius. Finally, click Left Mouse Button again to finish your action. 40 | 41 | Demo需要两个凸多边形来进行碰撞检测。 默认有两个三角形。 如果要修改的话,您可以点击"Clear All Convex Objects"按钮来清空当前的多边形。 然后在下拉菜单里选择您要添加的多边形类型。 42 | 目前支持多边形和圆形、胶囊体。添加方式是点击"Begin Add Convex"按钮来增加关键点, 点击"Cancel Add Convex"来退出添加多边形的操作,点击"Finish Add Convex"完成当前增加多边形的操作。 43 | 对着凸多边形按下鼠标中键可以拖动凸多边形的位置。鼠标滚轮可以调整坐标系的大小。 44 | 45 | 1. 当添加模式为Polygon多边形的时候,每次在坐标图上点击鼠标左键就可以增加一个顶点,点击鼠标右键可以撤销最近添加的一个顶点。当顶点足够之后,就可以点击"Finish Add Convex"来完成当前操作了。 46 | 2. 当添加模式为Circle圆形的时候,第一次点击鼠标左键是确定中心点位置,然后移动鼠标可以调整半径,当决定了之后再点击一次鼠标左键就可以完成添加。 47 | 3. 当添加模式为Capsule胶囊体的时候,第一次和第二次鼠标左键点击是确定高度的两个端点的位置,然后移动鼠标可以调整半径,当决定了之后再点击一次鼠标左键就可以完成添加。 48 | -------------------------------------------------------------------------------- /TsSource/Capsule.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export class Capsule extends Convex 4 | { 5 | private p0 : Vec2 = new Vec2(0, 0); 6 | private p1 : Vec2 = new Vec2(0, 0); 7 | private radius : number = 1; 8 | 9 | public constructor(p0 : Vec2, p1 : Vec2, radius : number) 10 | { 11 | super(); 12 | this.p0 = p0.Clone(); 13 | this.p1 = p1.Clone(); 14 | this.radius = radius; 15 | } 16 | 17 | public Translate(offset : Vec2) : void 18 | { 19 | this.p0 = this.p0.Add(offset); 20 | this.p1 = this.p1.Add(offset); 21 | } 22 | 23 | public readonly GetP0 = function() : Readonly 24 | { 25 | return this.p0; 26 | } 27 | 28 | public readonly GetP1 = function() : Readonly 29 | { 30 | return this.p1; 31 | } 32 | 33 | public readonly GetRadius = function() : number 34 | { 35 | return this.radius; 36 | } 37 | 38 | public IsPointInConvex(point : Vec2) : boolean 39 | { 40 | return PointDistanceToSegmentSqr(point, this.p0, this.p1) <= this.radius * this.radius; 41 | } 42 | 43 | public GetCenterCoord() : Vec2 44 | { 45 | return this.p0.Add(this.p1).Div(2); 46 | } 47 | 48 | public Support(dir : Vec2) : Vertex 49 | { 50 | let dotP0 = this.p0.Dot(dir); 51 | let dotP1 = this.p1.Dot(dir); 52 | if(dotP0 > dotP1) 53 | { 54 | return new Vertex(this.p0.Add(dir.Normalize().Mul(this.radius)), this.name); 55 | }else{ 56 | return new Vertex(this.p1.Add(dir.Normalize().Mul(this.radius)), this.name); 57 | } 58 | } 59 | 60 | public Draw(deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D, strokeColor : string, fillColor : string) : void 61 | { 62 | let radius = coord.GetCanvasPosByCoord(new Vec2(0, this.radius)).Sub(coord.GetCanvasPosByCoord(new Vec2(0, 0))).magnitude; 63 | 64 | 65 | context.lineWidth = 0.8; 66 | context.strokeStyle = strokeColor; 67 | 68 | 69 | let p0Pos = coord.GetCanvasPosByCoord(this.p0); 70 | let p1Pos = coord.GetCanvasPosByCoord(this.p1); 71 | let dir = p1Pos.Sub(p0Pos); 72 | let radiusDir = new Vec2(-dir.y, dir.x); 73 | radiusDir = radiusDir.Normalize().Mul(radius); 74 | let p0ArcStart = p0Pos.Add(radiusDir); 75 | let p1ArcStart = p1Pos.Sub(radiusDir); 76 | let Arc0StartAngle = Math.acos(radiusDir.x / radius); 77 | if(dir.x < 0) 78 | { 79 | Arc0StartAngle = Math.PI * 2 - Arc0StartAngle; 80 | } 81 | 82 | context.beginPath(); 83 | context.moveTo(p0ArcStart.x, p0ArcStart.y); 84 | context.arc(p0Pos.x, p0Pos.y, radius, Arc0StartAngle, Arc0StartAngle + Math.PI, false); 85 | context.lineTo(p1ArcStart.x, p1ArcStart.y); 86 | context.arc(p1Pos.x, p1Pos.y, radius, Arc0StartAngle + Math.PI, Arc0StartAngle + Math.PI + Math.PI, false); 87 | context.lineTo(p0ArcStart.x, p0ArcStart.y); 88 | context.stroke(); 89 | context.closePath(); 90 | context.fillStyle = fillColor; 91 | context.fill(); 92 | } 93 | } 94 | } -------------------------------------------------------------------------------- /TsSource/Circle.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export class Circle extends Convex 4 | { 5 | private center : Vec2 = new Vec2(0, 0); 6 | private radius : number = 1; 7 | 8 | public constructor(centerPos : Vec2, radius : number) 9 | { 10 | super(); 11 | this.center = centerPos; 12 | this.radius = radius; 13 | } 14 | 15 | public Translate(offset : Vec2) : void 16 | { 17 | this.center = this.center.Add(offset); 18 | } 19 | 20 | 21 | public readonly GetCenter = function() : Readonly 22 | { 23 | return this.center; 24 | } 25 | 26 | 27 | public readonly GetRadius = function() : number 28 | { 29 | return this.radius; 30 | } 31 | 32 | public IsPointInConvex(point : Vec2) : boolean 33 | { 34 | return point.Sub(this.center).magnitudeSqr <= this.radius * this.radius; 35 | } 36 | 37 | public GetCenterCoord() : Vec2 38 | { 39 | return this.center; 40 | } 41 | 42 | public Support(dir : Vec2) : Vertex 43 | { 44 | return new Vertex(this.center.Add(dir.Normalize().Mul(this.radius)), this.name); 45 | } 46 | 47 | public Draw(deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D, strokeColor : string, fillColor : string) : void 48 | { 49 | let centerPos = coord.GetCanvasPosByCoord(this.center); 50 | let radius = coord.GetCanvasPosByCoord(new Vec2(0, this.radius)).Sub(coord.GetCanvasPosByCoord(new Vec2(0, 0))).magnitude; 51 | 52 | context.beginPath(); 53 | context.arc(centerPos.x, centerPos.y, 4, 0, 2 * Math.PI, false); 54 | context.fillStyle = 'black'; 55 | context.fill(); 56 | context.closePath(); 57 | 58 | context.beginPath(); 59 | context.lineWidth = 0.8; 60 | context.strokeStyle = strokeColor; 61 | context.arc(centerPos.x, centerPos.y, radius, 0, 2 * Math.PI, false); 62 | context.stroke(); 63 | context.closePath(); 64 | context.fillStyle = fillColor; 65 | context.fill(); 66 | 67 | if (this.drawName && this.name) { 68 | context.fillStyle = 'black'; 69 | context.font = "40px Arial"; 70 | context.fillText(this.name, centerPos.x, centerPos.y); 71 | } 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /TsSource/Convex.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export abstract class Convex 4 | { 5 | public drawName : boolean = true; //toggle for name display; 6 | public fillColor : string = "#ffffffff"; 7 | private _name : string; 8 | 9 | public get name() : string //for display 10 | { 11 | return this._name; 12 | } 13 | 14 | public set name(inName : string) 15 | { 16 | this._name = inName ? inName.toUpperCase() : inName; 17 | } 18 | 19 | 20 | public abstract Translate(offset : Vec2) : void; 21 | 22 | 23 | public abstract IsPointInConvex(point : Vec2) : boolean; 24 | 25 | 26 | public abstract GetCenterCoord() : Vec2; 27 | 28 | 29 | public abstract Support(dir : Vec2) : Vertex; 30 | 31 | 32 | public abstract Draw(deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D, strokeColor : string, fillColor : string) : void; 33 | } 34 | } -------------------------------------------------------------------------------- /TsSource/Coordinate.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export class Coordinate 4 | { 5 | private canvas : HTMLCanvasElement; 6 | private imageCache : ImageData = null; 7 | private _coordXMax : number = 16.5; 8 | private _coordYMax : number = 16.5; 9 | 10 | constructor(inCanvas : HTMLCanvasElement) 11 | { 12 | this.canvas = inCanvas; 13 | } 14 | 15 | get canvasWidth() : number 16 | { 17 | return this.canvas.height; 18 | } 19 | 20 | get canvasHeight() : number 21 | { 22 | return this.canvas.height; 23 | } 24 | 25 | get coordXMax() : number 26 | { 27 | return this._coordXMax; 28 | } 29 | 30 | get coordYMax() : number 31 | { 32 | return this._coordYMax; 33 | } 34 | 35 | set coordXMax(xMax : number) 36 | { 37 | this._coordXMax = xMax; 38 | this.imageCache = null; 39 | } 40 | 41 | set coordYMax(yMax : number) 42 | { 43 | this._coordYMax = yMax; 44 | this.imageCache = null; 45 | } 46 | 47 | public GetCanvasPosByCoord(coord : Vec2) : Vec2 48 | { 49 | return new Vec2(this.canvasWidth / 2 * coord.x / this.coordXMax + this.canvasWidth / 2, this.canvasHeight / 2 - this.canvasHeight / 2 * coord.y / this.coordYMax); 50 | } 51 | 52 | 53 | public GetCoordByCanvasPos(pos : Vec2) : Vec2 54 | { 55 | return new Vec2(pos.x / this.canvasWidth * this.coordXMax * 2 - this.coordXMax, this.coordYMax - pos.y / this.canvasHeight * this.coordYMax * 2); 56 | } 57 | 58 | public Draw(deltaMs : number, context : CanvasRenderingContext2D) : void 59 | { 60 | if(this.imageCache) 61 | { 62 | context.putImageData(this.imageCache, 0, 0); 63 | return; 64 | } 65 | 66 | //Draw X and Y Axis 67 | context.beginPath(); 68 | let coordXMin_Pos : Vec2 = this.GetCanvasPosByCoord(new Vec2(-this.coordXMax, 0)); 69 | let coordXMan_Pos : Vec2 = this.GetCanvasPosByCoord(new Vec2(this.coordXMax, 0)); 70 | let coordYMin_Pos : Vec2 = this.GetCanvasPosByCoord(new Vec2(0, -this.coordYMax)); 71 | let coordYMax_Pos : Vec2 = this.GetCanvasPosByCoord(new Vec2(0, this.coordYMax)); 72 | context.lineWidth = 2; 73 | context.strokeStyle = 'black'; 74 | context.moveTo(coordXMin_Pos.x, coordXMin_Pos.y); 75 | context.lineTo(coordXMan_Pos.x, coordXMan_Pos.y); 76 | 77 | context.moveTo(coordYMin_Pos.x, coordYMin_Pos.y); 78 | context.lineTo(coordYMax_Pos.x, coordYMax_Pos.y); 79 | 80 | context.stroke(); 81 | context.closePath(); 82 | 83 | //Draw Coord Grids 84 | context.lineWidth = 0.5; 85 | context.setLineDash([3, 6]); 86 | context.strokeStyle = "#00ff00"; 87 | context.beginPath(); 88 | let xInt = Math.floor(this.coordXMax); 89 | let yInt = Math.floor(this.coordYMax); 90 | for(let x = -xInt; x <= xInt; ++x) 91 | { 92 | if(x == 0) 93 | { 94 | continue; 95 | } 96 | let minPos : Vec2 = this.GetCanvasPosByCoord(new Vec2(x, -this.coordYMax)); 97 | let maxPos : Vec2 = this.GetCanvasPosByCoord(new Vec2(x, this.coordYMax)); 98 | context.moveTo(minPos.x, minPos.y); 99 | context.lineTo(maxPos.x, maxPos.y); 100 | } 101 | 102 | 103 | for(let y = -yInt; y <= yInt; ++y) 104 | { 105 | if(y == 0) 106 | { 107 | continue; 108 | } 109 | let minPos : Vec2 = this.GetCanvasPosByCoord(new Vec2(-this.coordXMax, y)); 110 | let maxPos : Vec2 = this.GetCanvasPosByCoord(new Vec2(this.coordXMax, y)); 111 | context.moveTo(minPos.x, minPos.y); 112 | context.lineTo(maxPos.x, maxPos.y); 113 | } 114 | context.stroke(); 115 | context.closePath(); 116 | context.setLineDash([]); 117 | 118 | this.imageCache = context.getImageData(0, 0, this.canvasWidth, this.canvasHeight); 119 | } 120 | } 121 | } -------------------------------------------------------------------------------- /TsSource/Framework.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | 4 | export class Framework { 5 | private canvas : HTMLCanvasElement; 6 | private context : CanvasRenderingContext2D; 7 | private coord : Coordinate; 8 | private convexObjs : Convex[] = []; 9 | private convexCounter : number = 0; 10 | private readonly convexFillColors : string[] = ['#8e232244', '#2387ff44']; 11 | private customDrawsBeforeDrawConvex : ((deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>void) [] = []; 12 | private customDrawsAfterDrawConvex : ((deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>void) [] = []; 13 | private customDrawsFinal : ((deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>void) [] = []; 14 | private leftMouseDown : (evt : MouseEvent)=>void = null; 15 | private leftMouseMove : (evt : MouseEvent)=>void = null; 16 | private leftMouseUp : (evt : MouseEvent)=>void = null; 17 | 18 | 19 | constructor(inCanvas : HTMLCanvasElement) 20 | { 21 | this.canvas = inCanvas; 22 | this.context = this.canvas.getContext("2d") as CanvasRenderingContext2D; 23 | this.coord = new Coordinate(this.canvas); 24 | let lastUpdateTime = Date.now(); 25 | setInterval(()=>{ 26 | let currentTime = Date.now(); 27 | this.update(currentTime - lastUpdateTime); 28 | lastUpdateTime = currentTime; 29 | }, 16); 30 | 31 | let isLeftMouseDown = false; 32 | this.canvas.addEventListener('mousedown', (evt : MouseEvent)=>{ 33 | if(this.leftMouseDown && evt.button == 0) 34 | { 35 | isLeftMouseDown = true; 36 | this.leftMouseDown(evt); 37 | } 38 | }); 39 | this.canvas.addEventListener('mouseup', (evt : MouseEvent)=>{ 40 | if(this.leftMouseUp && evt.button == 0) 41 | { 42 | isLeftMouseDown = false; 43 | this.leftMouseUp(evt); 44 | } 45 | }); 46 | this.canvas.addEventListener('mousemove', (evt : MouseEvent)=>{ 47 | if(this.leftMouseMove && isLeftMouseDown) 48 | { 49 | this.leftMouseMove(evt); 50 | } 51 | }); 52 | this.canvas.addEventListener("wheel", (evt : WheelEvent)=>{ 53 | if(this.canvas.width < evt.offsetX || this.canvas.height < evt.offsetY) 54 | { 55 | return; 56 | } 57 | this.coord.coordXMax += evt.deltaY / 100; 58 | this.coord.coordYMax += evt.deltaY / 100; 59 | evt.preventDefault(); 60 | }); 61 | } 62 | 63 | 64 | public update(deltaMs : number) : void 65 | { 66 | this.ClearCanvas(); 67 | this.DrawCoordinate(deltaMs); 68 | this.customDrawsBeforeDrawConvex.forEach(element => { 69 | element(deltaMs, this.coord, this.context); 70 | }); 71 | this.DrawConvexObjs(deltaMs); 72 | this.customDrawsAfterDrawConvex.forEach(element => { 73 | element(deltaMs, this.coord, this.context); 74 | }); 75 | this.customDrawsFinal.forEach(element => { 76 | element(deltaMs, this.coord, this.context); 77 | }); 78 | 79 | if(this.convexObjs.length == 2) 80 | { 81 | if(GJKTest(this.convexObjs[0], this.convexObjs[1]) != null) 82 | { 83 | this.context.fillRect(0, 0, 20, 20); 84 | } 85 | } 86 | } 87 | 88 | public RegisterLeftMouseEvent(mouseDown : (evt : MouseEvent)=>void , mouseMove : (evt : MouseEvent)=>void , mouseUp:(evt : MouseEvent)=>void ) 89 | { 90 | this.leftMouseDown = mouseDown; 91 | this.leftMouseMove = mouseMove; 92 | this.leftMouseUp = mouseUp; 93 | } 94 | 95 | public UnRegisterLeftMouseEvent(mouseDown : (evt : MouseEvent)=>void , mouseMove : (evt : MouseEvent)=>void , mouseUp:(evt : MouseEvent)=>void ) 96 | { 97 | if(this.leftMouseDown == mouseDown) 98 | { 99 | this.leftMouseDown = null; 100 | } 101 | if(this.leftMouseUp == mouseUp) 102 | { 103 | this.leftMouseUp = null; 104 | } 105 | if(this.leftMouseMove == mouseMove) 106 | { 107 | this.leftMouseMove = null; 108 | } 109 | } 110 | 111 | public AddCustomDrawFunctionBeforeDrawConvex(func : (deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>void) 112 | { 113 | this.customDrawsBeforeDrawConvex.push(func); 114 | } 115 | 116 | public RmvCustomDrawFunctionBeforeDrawConvex(func : (deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>void) 117 | { 118 | let index = this.customDrawsBeforeDrawConvex.indexOf(func); 119 | if(index >= 0) 120 | { 121 | this.customDrawsBeforeDrawConvex.splice(index, 1); 122 | } 123 | } 124 | 125 | public AddCustomDrawFunctionAfterDrawConvex(func : (deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>void) 126 | { 127 | this.customDrawsAfterDrawConvex.push(func); 128 | } 129 | 130 | public RmvCustomDrawFunctionAfterDrawConvex(func : (deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>void) 131 | { 132 | let index = this.customDrawsAfterDrawConvex.indexOf(func); 133 | if(index >= 0) 134 | { 135 | this.customDrawsAfterDrawConvex.splice(index, 1); 136 | } 137 | } 138 | 139 | public AddCustomDrawFunctionFinal(func : (deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>void) 140 | { 141 | this.customDrawsFinal.push(func); 142 | } 143 | 144 | public RmvCustomDrawFunctionFinal(func : (deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>void) 145 | { 146 | let index = this.customDrawsFinal.indexOf(func); 147 | if(index >= 0) 148 | { 149 | this.customDrawsFinal.splice(index, 1); 150 | } 151 | } 152 | 153 | public GetCoordinate() : Coordinate 154 | { 155 | return this.coord; 156 | } 157 | 158 | private ClearCanvas() : void 159 | { 160 | this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); 161 | } 162 | 163 | 164 | private DrawCoordinate(deltaMs : number) : void 165 | { 166 | this.coord.Draw(deltaMs, this.context); 167 | } 168 | 169 | private DrawConvexObjs(deltaMs : number) : void 170 | { 171 | for(let i = 0; i < this.convexObjs.length; ++i) 172 | { 173 | this.convexObjs[i].Draw(deltaMs, this.coord, this.context, 'black', this.convexObjs[i].fillColor); 174 | } 175 | } 176 | 177 | public GetConvexObjsCount() : number 178 | { 179 | return this.convexObjs.length; 180 | } 181 | 182 | public GetConvex(index : number) : Convex 183 | { 184 | return this.convexObjs[index]; 185 | } 186 | 187 | //We always use (A - B) to calculate Minkowski Difference 188 | public GetConvexAB() : {A : Convex, B : Convex} 189 | { 190 | if(this.convexObjs.length != 2) 191 | { 192 | return null; 193 | } 194 | let convexObjs = [this.convexObjs[0], this.convexObjs[1]]; 195 | convexObjs.sort((a, b)=>{ 196 | return EncodeCustomCharCode(a.name) - EncodeCustomCharCode(b.name); 197 | }); 198 | return {A:convexObjs[0], B:convexObjs[1]}; 199 | } 200 | 201 | //the maximum number of convex objects is 2; 202 | public AddConvex(convex : Convex) : void 203 | { 204 | this.convexObjs.push(convex); 205 | convex.fillColor = this.convexFillColors[this.convexCounter % this.convexFillColors.length]; 206 | ++this.convexCounter; 207 | if(this.convexObjs.length > 2) 208 | { 209 | this.convexObjs.splice(0, 1); 210 | } 211 | } 212 | 213 | public RemoveConvex(convex : Convex | number) : void 214 | { 215 | if(convex instanceof Convex) 216 | { 217 | let index = this.convexObjs.indexOf(convex); 218 | if(index >= 0) 219 | { 220 | this.convexObjs.splice(index, 1); 221 | } 222 | }else{ 223 | this.convexObjs.splice(convex, 1); 224 | } 225 | } 226 | } 227 | } -------------------------------------------------------------------------------- /TsSource/Polygon.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export class Polygon extends Convex 4 | { 5 | private vertices : Vertex[] = []; 6 | 7 | 8 | public AddVertex(vertex : Vertex) : void 9 | { 10 | this.vertices.push(vertex); 11 | } 12 | 13 | public RemoveVertex(index : number) : void 14 | { 15 | this.vertices.splice(index, 1); 16 | } 17 | 18 | public SetVertices(vertices : ReadonlyArray) : void 19 | { 20 | this.vertices = [...vertices]; 21 | } 22 | 23 | public GetVertices() : ReadonlyArray 24 | { 25 | return this.vertices; 26 | } 27 | 28 | public Translate(offset : Vec2) : void 29 | { 30 | for(let i = 0; i < this.vertices.length; ++i) 31 | { 32 | this.vertices[i].coord = this.vertices[i].coord.Add(offset); 33 | } 34 | } 35 | 36 | //re-order the vertices, try to make this polygon convex(CW order). 37 | public ReOrder() : void 38 | { 39 | let verticesTmp:Vertex[] = [...this.vertices]; 40 | let newVerticesTmp:Vertex[] = []; 41 | if(verticesTmp.length < 3) 42 | { 43 | return; 44 | } 45 | 46 | let firstVertexIndex = -1; 47 | let minX = Number.MAX_SAFE_INTEGER; 48 | let maxY = Number.MIN_SAFE_INTEGER; 49 | for(let i = 0; i < verticesTmp.length; ++i) 50 | { 51 | if(verticesTmp[i].coord.x < minX 52 | || (verticesTmp[i].coord.x == minX && verticesTmp[i].coord.y > maxY) 53 | ) 54 | { 55 | minX = verticesTmp[i].coord.x; 56 | maxY = verticesTmp[i].coord.y; 57 | firstVertexIndex = i; 58 | } 59 | } 60 | newVerticesTmp.push(verticesTmp.splice(firstVertexIndex, 1)[0]); 61 | let startVertex = newVerticesTmp[0]; 62 | let upDir = new Vec2(0, 1); 63 | verticesTmp.sort((a, b)=>{ 64 | let dirA = a.coord.Sub(startVertex.coord); 65 | let dirB = b.coord.Sub(startVertex.coord); 66 | 67 | let magnitudeA = dirA.magnitude; 68 | let magnitudeB = dirB.magnitude; 69 | 70 | if(magnitudeA == 0) 71 | { 72 | return -1; 73 | }else if(magnitudeB == 0) 74 | { 75 | return 1; 76 | } 77 | 78 | dirA = dirA.Normalize(); 79 | dirB = dirB.Normalize(); 80 | 81 | let dotA = upDir.Dot(dirA); 82 | let dotB = upDir.Dot(dirB); 83 | 84 | if(dotA != dotB) 85 | { 86 | return dotB - dotA; 87 | } 88 | 89 | if(a.coord.y >= startVertex.coord.y) 90 | { 91 | return magnitudeA - magnitudeB 92 | }else{ 93 | return magnitudeB - magnitudeA; 94 | } 95 | 96 | return 1; 97 | }); 98 | 99 | newVerticesTmp.push(...verticesTmp); 100 | this.vertices = newVerticesTmp; 101 | } 102 | 103 | public Rebuild() : void 104 | { 105 | this.vertices = GetConvexFromVertices(this.vertices); 106 | } 107 | 108 | public IsConvex() : boolean 109 | { 110 | if(this.vertices.length < 3) 111 | { 112 | return false; 113 | } 114 | let lastCross = 0; 115 | for(let i = 0; i < this.vertices.length; ++i) 116 | { 117 | let point = this.vertices[i]; 118 | let point_prev = this.vertices[(i - 1 + this.vertices.length) % this.vertices.length]; 119 | let point_next = this.vertices[(i + 1) % this.vertices.length]; 120 | 121 | let vector1 = point.coord.Sub(point_prev.coord); 122 | let vector2 = point_next.coord.Sub(point.coord); 123 | 124 | let cross = vector1.Cross(vector2); 125 | 126 | if(lastCross == 0) 127 | { 128 | lastCross = cross; 129 | }else if(cross != 0){ 130 | if(cross * lastCross < 0) 131 | { 132 | return false; 133 | } 134 | lastCross = cross; 135 | } 136 | 137 | } 138 | return true; 139 | } 140 | 141 | public IsPointInConvex(point : Vec2) : boolean 142 | { 143 | if(this.vertices.length < 3) 144 | { 145 | return false; 146 | } 147 | let lastCross = 0; 148 | for(let i = 0; i < this.vertices.length; ++i) 149 | { 150 | let point_current = this.vertices[i]; 151 | let point_next = this.vertices[(i + 1) % this.vertices.length]; 152 | 153 | let vector1 = point_next.coord.Sub(point_current.coord); 154 | let vector2 = point.Sub(point_current.coord); 155 | 156 | let cross = vector1.Cross(vector2); 157 | 158 | if(lastCross == 0) 159 | { 160 | lastCross = cross; 161 | }else if(cross != 0){ 162 | if(cross * lastCross < 0) 163 | { 164 | return false; 165 | } 166 | lastCross = cross; 167 | } 168 | 169 | } 170 | return true; 171 | } 172 | 173 | public GetCenterCoord() : Vec2 174 | { 175 | let center : Vec2 = new Vec2(); 176 | let sumWeight : number = 0; 177 | for(let i = 0; i < this.vertices.length; ++i) 178 | { 179 | let point = this.vertices[i]; 180 | let point_prev = this.vertices[(i - 1 + this.vertices.length) % this.vertices.length]; 181 | let point_next = this.vertices[(i + 1) % this.vertices.length]; 182 | 183 | let weight = point.coord.Sub(point_prev.coord).magnitude + point.coord.Sub(point_next.coord).magnitude; 184 | center = center.Add(point.coord.Mul(weight)); 185 | sumWeight += weight; 186 | } 187 | return center.Div(sumWeight); 188 | } 189 | 190 | public Support(dir : Vec2) : Vertex 191 | { 192 | let maxDot = Number.MIN_SAFE_INTEGER; 193 | let supportVertex : Vertex = null; 194 | for(let i = 0; i < this.vertices.length; ++i) 195 | { 196 | let candidiateVertex = this.vertices[i]; 197 | let dot = candidiateVertex.coord.Dot(dir); 198 | if(dot > maxDot) 199 | { 200 | maxDot = dot; 201 | supportVertex = candidiateVertex; 202 | } 203 | } 204 | return supportVertex; 205 | } 206 | 207 | public Draw(deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D, strokeColor : string, fillColor : string) : void 208 | { 209 | if(this.vertices.length <= 0) 210 | { 211 | return; 212 | } 213 | context.beginPath(); 214 | context.lineWidth = 0.8; 215 | context.strokeStyle = strokeColor; 216 | let beginPos = coord.GetCanvasPosByCoord(this.vertices[0].coord); 217 | context.moveTo(beginPos.x, beginPos.y); 218 | for(let i = 1; i <= this.vertices.length; ++i) 219 | { 220 | let pos = coord.GetCanvasPosByCoord(this.vertices[i % this.vertices.length].coord); 221 | context.lineTo(pos.x, pos.y); 222 | } 223 | context.stroke(); 224 | context.closePath(); 225 | context.fillStyle = this.fillColor; 226 | context.fill(); 227 | 228 | for(let i = 0; i < this.vertices.length; ++i) 229 | { 230 | this.vertices[i].Draw(deltaMs, coord, context); 231 | } 232 | if(this.drawName && this.name) 233 | { 234 | let pos = coord.GetCanvasPosByCoord(this.GetCenterCoord()); 235 | context.fillStyle = 'black'; 236 | context.font = "40px Arial"; 237 | context.fillText(this.name, pos.x, pos.y); 238 | } 239 | } 240 | } 241 | } -------------------------------------------------------------------------------- /TsSource/Raycast.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export class Raycast 4 | { 5 | private _p : Vec2; //start point 6 | private _dir : Vec2; //normalized dir 7 | private _t : number; //raycast length; 8 | 9 | constructor(point : Vec2, dir : Vec2, length:number) 10 | { 11 | this._p = point.Clone(); 12 | this._dir = dir.Normalize(); 13 | this._t = length; 14 | } 15 | 16 | public get Point() : Readonly 17 | { 18 | return this._p; 19 | } 20 | 21 | public set Point(newStartPoint : Readonly) 22 | { 23 | this._p = newStartPoint.Clone(); 24 | } 25 | 26 | public get Dir() : Readonly 27 | { 28 | return this._dir; 29 | } 30 | 31 | public set Dir(dir : Readonly) 32 | { 33 | this._dir = dir.Normalize(); 34 | } 35 | 36 | public get Length() : number 37 | { 38 | return this._t; 39 | } 40 | 41 | public set Length(length : number) 42 | { 43 | this._t = length; 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /TsSource/ShowCase_EPA.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export function InitShowCase_DrawEPAStep(framework : Framework, canvas:HTMLCanvasElement, epaStepBtn:HTMLElement, epaUndoBtn:HTMLElement, epaClearBtn:HTMLElement, epaPushOutToggleBtn:HTMLElement, ) : void 4 | { 5 | let stepStack : EPAStepResult[] = []; 6 | 7 | //Draw 8 | let drawEPACustom = function(deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D) : void 9 | { 10 | if(stepStack.length == 0) 11 | { 12 | return; 13 | } 14 | let drawStep = stepStack[stepStack.length - 1]; 15 | 16 | context.lineWidth = 1; 17 | context.strokeStyle = '#cc112266'; 18 | context.fillStyle = '#cc112266'; 19 | 20 | //draw lines and try to fill 21 | let startPos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[0].coord); 22 | context.moveTo(startPos.x, startPos.y); 23 | context.beginPath(); 24 | for(let i = 0; i < drawStep.simplex.GetVertices().length; ++i) 25 | { 26 | let pos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[i].coord); 27 | context.lineTo(pos.x, pos.y); 28 | } 29 | context.stroke(); 30 | context.fill(); 31 | context.closePath(); 32 | 33 | 34 | //draw support dir 35 | let startCoord = new Vec2(0, 0); 36 | startPos = coord.GetCanvasPosByCoord(startCoord); 37 | let endPos = coord.GetCanvasPosByCoord(startCoord.Add(drawStep.supportDir)); 38 | let bestLength = canvas.width / 4; 39 | endPos = startPos.Add(endPos.Sub(startPos).Normalize().Mul(bestLength)); 40 | drawArrow(context, startPos, endPos, bestLength / 10, 4, 'red'); 41 | 42 | //check if epa is finished. 43 | let bFinished = (stepStack.length >= 2 && drawStep.isLastStep); 44 | if(bFinished) 45 | { 46 | let resolveResult = ResolveEPAStep(drawStep); 47 | 48 | drawArrow(context, coord.GetCanvasPosByCoord(resolveResult.penetrationPointOnConvexA), coord.GetCanvasPosByCoord(resolveResult.penetrationPointOnConvexB), 0, 2, 'blue'); 49 | } 50 | } 51 | framework.AddCustomDrawFunctionAfterDrawConvex(drawEPACustom); 52 | 53 | 54 | 55 | 56 | epaClearBtn.onclick = (evt)=>{ 57 | stepStack = []; 58 | EnableDraggingConvexObj(); 59 | }; 60 | 61 | epaUndoBtn.onclick = (evt)=>{ 62 | if(stepStack.length > 1) 63 | { 64 | stepStack.pop(); 65 | } 66 | } 67 | 68 | 69 | epaStepBtn.onclick = (evt)=>{ 70 | let convexAB = framework.GetConvexAB(); 71 | if(!convexAB) 72 | { 73 | return null; 74 | } 75 | let convexA = convexAB.A; 76 | let convexB = convexAB.B; 77 | 78 | let lastStepResult = stepStack.length > 0 ? stepStack[stepStack.length - 1] : null; 79 | let stepResult : EPAStepResult = null; 80 | if(!lastStepResult) 81 | { 82 | //It's the first step, use the gjk result simplex as the basic simplex. 83 | let simplexGJKResult = GJKTest(convexA, convexB); 84 | if(!simplexGJKResult) 85 | { 86 | return; 87 | } 88 | DisableDraggingConvexObj(); 89 | stepResult = new EPAStepResult(); 90 | stepResult.simplex = simplexGJKResult; 91 | //give a next suggested support dir 92 | stepResult.supportDir = EPAGetBestNextSupportDir(stepResult.simplex); 93 | }else{ 94 | stepResult = EPAStep(convexA, convexB, lastStepResult); 95 | } 96 | 97 | stepStack.push(stepResult); 98 | } 99 | 100 | let autoPushOutHandle = -1; 101 | let autoPushOutEnable = false; 102 | 103 | function epaPushOutUpdate(dtMs : number) 104 | { 105 | let convexAB = framework.GetConvexAB(); 106 | if(!convexAB) 107 | { 108 | return null; 109 | } 110 | let convexA = convexAB.A; 111 | let convexB = convexAB.B; 112 | let epaResult = EAPTest(convexA, convexB); 113 | if(!epaResult) 114 | { 115 | return; 116 | } 117 | let pushObj = convexB; 118 | let pushDir = epaResult.penetrationDepthAtoB; 119 | if(GetCurrentDraggingConvexObj() == convexB) 120 | { 121 | pushObj = convexA; 122 | pushDir = pushDir.Mul(-1); 123 | } 124 | 125 | let maxDistance = pushDir.magnitude; 126 | let distance = Math.min(10 / 1000 * dtMs, maxDistance); //move 10 unit coord per second 127 | pushDir = pushDir.Normalize(); 128 | pushObj.Translate(pushDir.Mul(distance)); 129 | } 130 | 131 | epaPushOutToggleBtn.onclick = (evt)=>{ 132 | if(!autoPushOutEnable) 133 | { 134 | autoPushOutEnable = true; 135 | let lastUpdateTimeMs = Date.now(); 136 | autoPushOutHandle = setInterval(()=>{ 137 | let currentTimeMs = Date.now(); 138 | let delta = currentTimeMs - lastUpdateTimeMs; 139 | epaPushOutUpdate(delta); 140 | lastUpdateTimeMs = currentTimeMs; 141 | }, 16); 142 | }else{ 143 | clearInterval(autoPushOutHandle); 144 | autoPushOutEnable = false; 145 | } 146 | } 147 | } 148 | } -------------------------------------------------------------------------------- /TsSource/ShowCase_GJK.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export function InitShowCase_DrawGJKStep(framework : Framework, canvas:HTMLCanvasElement, gjkStepBtn:HTMLElement, gjkUndoBtn:HTMLElement, gjkClearBtn:HTMLElement) : void 4 | { 5 | let stepStack : GJKStepResult[] = []; 6 | let currentSupportDir : Vec2 = new Vec2(0, 0); 7 | let currentSupportDirStartCoord : Vec2 = new Vec2(0, 0); 8 | 9 | //Draw 10 | let drawGJKCustom = function(deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D) : void 11 | { 12 | if(stepStack.length == 0) 13 | { 14 | return; 15 | } 16 | let drawStep = stepStack[stepStack.length - 1]; 17 | 18 | context.lineWidth = 1; 19 | context.strokeStyle = '#cc112266'; 20 | context.fillStyle = '#cc112266'; 21 | 22 | //draw vertices 23 | for(let i = 0; i < drawStep.simplex.GetVertices().length; ++i) 24 | { 25 | let pos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[i].coord); 26 | context.beginPath(); 27 | context.arc(pos.x, pos.y, 10, 0, 2 * Math.PI, false); 28 | context.fill(); 29 | context.closePath(); 30 | } 31 | 32 | //draw lines and try to fill 33 | let startPos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[0].coord); 34 | context.moveTo(startPos.x, startPos.y); 35 | context.beginPath(); 36 | for(let i = 0; i < drawStep.simplex.GetVertices().length; ++i) 37 | { 38 | let pos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[i].coord); 39 | context.lineTo(pos.x, pos.y); 40 | } 41 | context.stroke(); 42 | if(drawStep.simplex.GetVertices().length > 2) 43 | { 44 | context.fill(); 45 | } 46 | context.closePath(); 47 | 48 | 49 | //draw support dir 50 | startPos = coord.GetCanvasPosByCoord(currentSupportDirStartCoord); 51 | let endPos = coord.GetCanvasPosByCoord(currentSupportDirStartCoord.Add(currentSupportDir)); 52 | let bestLength = canvas.width / 4; 53 | endPos = startPos.Add(endPos.Sub(startPos).Normalize().Mul(bestLength)); 54 | drawArrow(context, startPos, endPos, bestLength / 10, 4, 'red'); 55 | } 56 | framework.AddCustomDrawFunctionAfterDrawConvex(drawGJKCustom); 57 | 58 | 59 | //Manually configure support dir 60 | let mouseDown = function(evt : MouseEvent) 61 | { 62 | let pos = new Vec2(evt.offsetX, evt.offsetY); 63 | currentSupportDirStartCoord = framework.GetCoordinate().GetCoordByCanvasPos(pos); 64 | } 65 | 66 | let mouseUp = function(evt : MouseEvent) 67 | { 68 | let pos = new Vec2(evt.offsetX, evt.offsetY); 69 | let coord = framework.GetCoordinate().GetCoordByCanvasPos(pos); 70 | currentSupportDir = coord.Sub(currentSupportDirStartCoord); 71 | } 72 | 73 | let mouseMove = function(evt : MouseEvent) 74 | { 75 | let pos = new Vec2(evt.offsetX, evt.offsetY); 76 | let coord = framework.GetCoordinate().GetCoordByCanvasPos(pos); 77 | currentSupportDir = coord.Sub(currentSupportDirStartCoord); 78 | } 79 | 80 | 81 | gjkClearBtn.onclick = (evt)=>{ 82 | stepStack = []; 83 | EnableDraggingConvexObj(); 84 | framework.UnRegisterLeftMouseEvent(mouseDown, mouseMove, mouseUp); 85 | }; 86 | 87 | gjkUndoBtn.onclick = (evt)=>{ 88 | if(stepStack.length > 1) 89 | { 90 | let undoStep = stepStack.pop(); 91 | if(undoStep) 92 | { 93 | currentSupportDir = undoStep.supportDir; 94 | currentSupportDirStartCoord = undoStep['supportDirStart']; 95 | if(!currentSupportDirStartCoord) 96 | { 97 | currentSupportDirStartCoord = new Vec2(0, 0); 98 | } 99 | } 100 | } 101 | } 102 | 103 | 104 | gjkStepBtn.onclick = (evt)=>{ 105 | let convexAB = framework.GetConvexAB(); 106 | if(!convexAB) 107 | { 108 | return null; 109 | } 110 | let convexA = convexAB.A; 111 | let convexB = convexAB.B; 112 | 113 | let lastStepResult = stepStack.length > 0 ? stepStack[stepStack.length - 1] : null; 114 | if(!lastStepResult) 115 | { 116 | DisableDraggingConvexObj(); 117 | framework.RegisterLeftMouseEvent(mouseDown, mouseMove, mouseUp); 118 | //it's the first step, we specify the dir from convexB to convexA as the support dir 119 | currentSupportDir = convexA.GetCenterCoord().Sub(convexB.GetCenterCoord()); 120 | } 121 | let stepResult = GJKStep(convexA, convexB, currentSupportDir, lastStepResult); 122 | stepResult['supportDirStart'] = currentSupportDirStartCoord; 123 | stepStack.push(stepResult); 124 | 125 | //give a suggested support dir 126 | currentSupportDir = GJKGetBestNextSupportDir(stepResult.simplex); 127 | if(!currentSupportDir) 128 | { 129 | //after first step, there is only 1 vertex in simplex, so we must specify a support dir. 130 | currentSupportDir = convexB.GetCenterCoord().Sub(convexA.GetCenterCoord()); 131 | currentSupportDirStartCoord = convexA.GetCenterCoord(); 132 | }else{ 133 | let nearestVertices = stepResult.simplex.GetClosestEdgeToOrigin(); 134 | currentSupportDirStartCoord = nearestVertices[0].coord.Add(nearestVertices[1].coord).Div(2); 135 | } 136 | } 137 | } 138 | } -------------------------------------------------------------------------------- /TsSource/ShowCase_MinkowskiDiff.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | function GetFullMinkowskiDiffVertices(conv1 : Convex, conv2 : Convex) : SimplexVertex[] 4 | { 5 | let result : SimplexVertex[] = []; 6 | let poly1 = conv1 as Polygon; 7 | let poly2 = conv2 as Polygon; 8 | if(!(poly1 instanceof Polygon) || !(poly2 instanceof Polygon)) 9 | { 10 | window.alert("Only Polygon Objects can draw Full Minkowski Difference!"); 11 | return result; 12 | } 13 | for(let i = 0; i < poly1.GetVertices().length; ++i) 14 | { 15 | for(let j = 0; j < poly2.GetVertices().length; ++j) 16 | { 17 | let vertex = new Vertex(poly1.GetVertices()[i].coord.Sub(poly2.GetVertices()[j].coord), ""); 18 | let simplexVertex = new SimplexVertex(vertex, poly1.GetVertices()[i].coord, poly2.GetVertices()[j].coord); 19 | simplexVertex.drawName = false; 20 | simplexVertex.name = poly1.GetVertices()[i].name + "-" + poly2.GetVertices()[j].name; 21 | result.push(simplexVertex); 22 | } 23 | } 24 | return result; 25 | } 26 | 27 | 28 | export function InitShowCase_MinkowskiDiff(framework : Framework, buttonShowMinkowskiDiff:HTMLElement) : void 29 | { 30 | let drawEdgeNum = -1; 31 | let timeBeginMs = 0; 32 | let allVertices : SimplexVertex[] = []; 33 | let drawFullMinkowskiDiff = (deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D)=>{ 34 | 35 | let convexAB = framework.GetConvexAB(); 36 | if(!convexAB || drawEdgeNum == -1) 37 | { 38 | return null; 39 | } 40 | let convexA = convexAB.A; 41 | let convexB = convexAB.B; 42 | 43 | allVertices = GetFullMinkowskiDiffVertices(convexA, convexB); 44 | 45 | if(allVertices.length < 3) 46 | { 47 | return; 48 | } 49 | 50 | let diffOutlineVertices = GetConvexFromVertices(allVertices); 51 | 52 | if(diffOutlineVertices.length < 3) 53 | { 54 | return; 55 | } 56 | 57 | if(drawEdgeNum > diffOutlineVertices.length + 1) 58 | { 59 | drawEdgeNum = -1; 60 | return; 61 | } 62 | 63 | let finishedDrawAllEdges = (drawEdgeNum > diffOutlineVertices.length); 64 | 65 | //Draw Candidiate Vertices When Show Animation 66 | if(!finishedDrawAllEdges) 67 | { 68 | for(let i = 0; i < allVertices.length; ++i) 69 | { 70 | let ve = allVertices[i]; 71 | let pos = coord.GetCanvasPosByCoord(ve.coord); 72 | context.lineWidth = 0; 73 | context.fillStyle = 'red'; 74 | context.moveTo(pos.x, pos.y); 75 | context.beginPath(); 76 | context.arc(pos.x, pos.y, 3, 0, 360, false); 77 | context.fill(); 78 | context.closePath(); 79 | context.fillText(allVertices[i].name + "", pos.x, pos.y); 80 | } 81 | } 82 | 83 | //Draw Edges 84 | let startPos = coord.GetCanvasPosByCoord(diffOutlineVertices[0].coord); 85 | context.moveTo(startPos.x, startPos.y); 86 | context.beginPath(); 87 | context.setLineDash([]); //solidLine 88 | context.strokeStyle = 'green'; 89 | context.lineWidth = finishedDrawAllEdges ? 0.5 : 2; 90 | for(let i = 0; i < Math.min(diffOutlineVertices.length + 1, drawEdgeNum); ++i) 91 | { 92 | let pos = coord.GetCanvasPosByCoord(diffOutlineVertices[i % diffOutlineVertices.length].coord); 93 | context.lineTo(pos.x, pos.y); 94 | } 95 | context.stroke(); 96 | if(finishedDrawAllEdges) 97 | { 98 | context.fillStyle = '#00FF2228'; 99 | context.fill(); 100 | } 101 | context.closePath(); 102 | 103 | //Animation 104 | if(!finishedDrawAllEdges && drawEdgeNum > 0) 105 | { 106 | let fromDir = new Vec2(0, 1); 107 | if(drawEdgeNum > 1) 108 | { 109 | fromDir = diffOutlineVertices[drawEdgeNum - 1].coord.Sub(diffOutlineVertices[drawEdgeNum - 2].coord); 110 | } 111 | let targetDir = diffOutlineVertices[drawEdgeNum % diffOutlineVertices.length].coord.Sub(diffOutlineVertices[drawEdgeNum - 1].coord); 112 | let currentDir = new Vec2(targetDir.x, targetDir.y); 113 | let targetDegree = fromDir.GetDegreeToCW(targetDir); 114 | 115 | let startPosAnim = coord.GetCanvasPosByCoord(diffOutlineVertices[drawEdgeNum - 1].coord); 116 | context.moveTo(startPosAnim.x, startPosAnim.y); 117 | context.beginPath(); 118 | let currentDegree = (Date.now() - timeBeginMs) * 0.1; 119 | context.setLineDash([]); 120 | if(currentDegree < targetDegree) 121 | { 122 | currentDir = fromDir.RotateCW(currentDegree); 123 | context.strokeStyle = 'red'; 124 | context.lineWidth = 3; 125 | context.setLineDash([3, 3]); 126 | }else{ 127 | context.strokeStyle = 'green'; 128 | context.lineWidth = 2; 129 | } 130 | currentDir = currentDir.Normalize().Mul(coord.coordXMax); 131 | 132 | let targetPos = coord.GetCanvasPosByCoord(diffOutlineVertices[drawEdgeNum - 1].coord.Add(currentDir)); 133 | context.lineTo(startPosAnim.x, startPosAnim.y); 134 | context.lineTo(targetPos.x, targetPos.y); 135 | context.stroke(); 136 | context.setLineDash([]); 137 | context.closePath(); 138 | } 139 | 140 | //name of Vertices 141 | if(finishedDrawAllEdges) 142 | { 143 | diffOutlineVertices.forEach((vertex)=>{ 144 | let pos = coord.GetCanvasPosByCoord(vertex.coord); 145 | context.fillStyle = 'green'; 146 | context.font = "20px Arial"; 147 | context.fillText(vertex.name + "(" + numToString(vertex.coord.x, 2) + "," + numToString(vertex.coord.y, 2) + ")", pos.x, pos.y); 148 | }) 149 | } 150 | }; 151 | 152 | framework.AddCustomDrawFunctionBeforeDrawConvex(drawFullMinkowskiDiff); 153 | 154 | buttonShowMinkowskiDiff.onclick = (evt)=>{ 155 | ++drawEdgeNum; 156 | timeBeginMs = Date.now(); 157 | } 158 | } 159 | } -------------------------------------------------------------------------------- /TsSource/Simplex.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export class Simplex extends Polygon 4 | { 5 | public IncludeOrigin() : boolean 6 | { 7 | return this.IsPointInConvex(new Vec2(0, 0)); 8 | } 9 | 10 | public AddVertex(vertex : SimplexVertex) : void 11 | { 12 | super.AddVertex(vertex); 13 | } 14 | 15 | public SetVertices(vertices : ReadonlyArray) : void 16 | { 17 | super.SetVertices(vertices); 18 | } 19 | 20 | public GetVertices() : ReadonlyArray 21 | { 22 | return super.GetVertices() as ReadonlyArray; 23 | } 24 | 25 | //return null if vertices count is less than 2. 26 | public GetClosestEdgeToOrigin() : ReadonlyArray 27 | { 28 | if(this.GetVertices().length < 2) 29 | { 30 | return null; 31 | }else if(this.GetVertices().length == 2) 32 | { 33 | return this.GetVertices() as ReadonlyArray; 34 | } 35 | let closestDistanceSqr = Number.MAX_SAFE_INTEGER; 36 | let resultVertices : SimplexVertex[] = [null, null]; 37 | let origin:Readonly = new Vec2(0, 0); 38 | for(let i = 0; i < this.GetVertices().length; ++i) 39 | { 40 | let p0 = this.GetVertices()[i] as SimplexVertex; 41 | let p1 = this.GetVertices()[(i + 1) % this.GetVertices().length] as SimplexVertex; 42 | 43 | let distanceSqr = PointDistanceToSegmentSqr(origin, p0.coord, p1.coord); 44 | if(distanceSqr < closestDistanceSqr) 45 | { 46 | closestDistanceSqr = distanceSqr; 47 | resultVertices[0] = p0; 48 | resultVertices[1] = p1; 49 | } 50 | } 51 | return resultVertices; 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /TsSource/SimplexVertex.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | //This type of vertex is used for Simplex 4 | export class SimplexVertex extends Vertex 5 | { 6 | private m_convexACoord : Vec2; 7 | private m_convexBCoord : Vec2; 8 | 9 | constructor(diffVertex : Vertex, convexACoord : Vec2, convexBCoord : Vec2) 10 | { 11 | super(diffVertex.coord, diffVertex.name); 12 | this.m_convexACoord = convexACoord.Clone(); 13 | this.m_convexBCoord = convexBCoord.Clone(); 14 | } 15 | 16 | public GetConvexCoordA() : Readonly 17 | { 18 | return this.m_convexACoord; 19 | } 20 | 21 | public GetConvexCoordB() : Readonly 22 | { 23 | return this.m_convexBCoord; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /TsSource/Utils.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export function numToString(num : number, accuracy : number) : string 4 | { 5 | let mul = Math.pow(10, accuracy); 6 | num = num * mul; 7 | num = Math.round(num); 8 | num = num / mul; 9 | return num + ""; 10 | } 11 | 12 | //custom alphabet decode 13 | export function DecodeCustomCharCode(code : number, isSmallCase : boolean) : string 14 | { 15 | let startAsciiCode : number = isSmallCase ? 97 : 65; //97 is ascii code of letter 'a' while 65 is that of letter 'A'; 16 | let name =''; 17 | do{ 18 | let tail = code % 26; 19 | name = String.fromCharCode(startAsciiCode + tail) + name; 20 | code = (code - tail) / 26; 21 | }while(code > 0); 22 | return name; 23 | } 24 | 25 | //custom alphabet encode 26 | export function EncodeCustomCharCode(text : string) : number 27 | { 28 | let result = 0; 29 | for(let i = 0; i < text.length; ++i) 30 | { 31 | let char = text.charCodeAt(i); 32 | if(char >= 65 && char <= 90) //upperCase 33 | { 34 | char -= 65; 35 | }else if(char >= 97 && char <= 122) 36 | { 37 | char -= 97; //lowerCase 38 | } 39 | result += char * Math.pow(26, text.length - 1 - i); 40 | } 41 | return result; 42 | } 43 | 44 | //try to make a convex as small as possible to surround all the input vertices 45 | //the return value is in cw order, may be some inner vertices will be discarded. 46 | export function GetConvexFromVertices(vertices : Vertex[]) : Vertex[] 47 | { 48 | let result : Vertex[] = []; 49 | 50 | let startVertexIndex = -1; 51 | for(let i = 0; i < vertices.length; ++i) 52 | { 53 | let vertex = vertices[i]; 54 | if(startVertexIndex < 0) 55 | { 56 | startVertexIndex = i; 57 | }else if(vertex.coord.x < vertices[startVertexIndex].coord.x){ 58 | startVertexIndex = i; 59 | }else if(vertex.coord.x == vertices[startVertexIndex].coord.x && vertex.coord.y > vertices[startVertexIndex].coord.y) 60 | { 61 | startVertexIndex = i; 62 | } 63 | } 64 | 65 | let startVertex = vertices[startVertexIndex]; 66 | result.push(startVertex); 67 | 68 | while(true) 69 | { 70 | let fromDir = new Vec2(0, 1); //up direction 71 | for(let i = result.length - 1; i > 0; --i) 72 | { 73 | let dir = result[i].coord.Sub(result[i - 1].coord); 74 | if(dir.magnitudeSqr != 0) 75 | { 76 | fromDir = dir; 77 | break; 78 | } 79 | } 80 | let currentStartCoord = result[result.length - 1].coord; 81 | let nextVertexIndex = -1; 82 | let nextVertexDegree = Number.MAX_SAFE_INTEGER; 83 | for(let i = 0; i < vertices.length; ++i) 84 | { 85 | let candidiateCoord = vertices[i].coord; 86 | let candidiateDir = candidiateCoord.Sub(currentStartCoord); 87 | if(Math.abs(candidiateDir.x) < Number.EPSILON && Math.abs(candidiateDir.y) < Number.EPSILON) 88 | { 89 | //ignore overlapping vertex 90 | continue; 91 | } 92 | let candidiateDegreeCw = fromDir.GetDegreeToCW(candidiateDir); 93 | if(candidiateDegreeCw < nextVertexDegree) 94 | { 95 | nextVertexIndex = i; 96 | nextVertexDegree = candidiateDegreeCw; 97 | } 98 | } 99 | 100 | let nextVertex = vertices[nextVertexIndex]; 101 | if(nextVertex == startVertex) 102 | { 103 | break; 104 | } 105 | result.push(nextVertex); 106 | } 107 | 108 | return result; 109 | } 110 | 111 | 112 | 113 | export function PointDistanceToSegmentSqr (point : Vec2, segmentP0 : Vec2, segmentP1 : Vec2) : number{ 114 | let l2 = segmentP0.Sub(segmentP1).magnitudeSqr; 115 | if (l2 === 0) 116 | { 117 | return segmentP0.Sub(point).magnitudeSqr; 118 | } 119 | let t = ((point.x - segmentP0.x) * (segmentP1.x - segmentP0.x) + (point.y - segmentP0.y) * (segmentP1.y - segmentP0.y)) / l2; 120 | t = Math.max(0, Math.min(1, t)); 121 | return new Vec2(segmentP0.x + t * (segmentP1.x - segmentP0.x), segmentP0.y + t * (segmentP1.y - segmentP0.y)).Sub(point).magnitudeSqr; 122 | } 123 | 124 | 125 | export function PointDistanceToSegment (point : Vec2, segmentP0 : Vec2, segmentP1 : Vec2) { 126 | return Math.sqrt(PointDistanceToSegmentSqr(point, segmentP0, segmentP1)); 127 | } 128 | 129 | 130 | export function ClosestPointOnSegment (point : Vec2, segmentP0 : Vec2, segmentP1 : Vec2) : Vec2 131 | { 132 | let dot0 = segmentP1.Sub(segmentP0).Dot(point.Sub(segmentP0)); 133 | if(dot0 <= 0) 134 | { 135 | return segmentP0.Clone(); 136 | } 137 | let dot1 = segmentP0.Sub(segmentP1).Dot(point.Sub(segmentP1)); 138 | if(dot1 <= 0) 139 | { 140 | return segmentP1.Clone(); 141 | } 142 | let dir = segmentP1.Sub(segmentP0); 143 | let lengthSqr = dir.magnitudeSqr; 144 | let result = segmentP0.Add(dir.Mul(dot0 / lengthSqr)); 145 | return result; 146 | } 147 | 148 | export function Lerp01(point0 : Vec2, point1 : Vec2, lerpValue : number) 149 | { 150 | let diff = point1.Sub(point0); 151 | let magSqr = diff.magnitudeSqr; 152 | if(Math.abs(magSqr) < Number.EPSILON) 153 | { 154 | return point0.Clone(); 155 | } 156 | let mag = Math.sqrt(magSqr); 157 | let normalize = diff.Div(mag); 158 | return point0.Add(normalize.Mul(mag * lerpValue)); 159 | } 160 | 161 | 162 | //draw a directional arrow 163 | export function drawArrow(context : CanvasRenderingContext2D, startPos : Vec2, endPos : Vec2, arrowLength : number, width : number, color : string) 164 | { 165 | context.lineWidth = width; 166 | context.strokeStyle = color; 167 | context.moveTo(startPos.x, startPos.y); 168 | context.beginPath(); 169 | context.lineTo(startPos.x, startPos.y); 170 | context.lineTo(endPos.x, endPos.y); 171 | 172 | let dir = endPos.Sub(startPos).Normalize().Mul(arrowLength); 173 | let leftDir = dir.RotateCW(240); 174 | let rightDir = dir.RotateCW(120); 175 | 176 | let leftArrowPoint = endPos.Add(leftDir); 177 | context.lineTo(leftArrowPoint.x, leftArrowPoint.y); 178 | let rightArrowPoint = endPos.Add(rightDir); 179 | context.lineTo(rightArrowPoint.x, rightArrowPoint.y); 180 | context.lineTo(endPos.x, endPos.y); 181 | context.stroke(); 182 | context.closePath(); 183 | } 184 | } -------------------------------------------------------------------------------- /TsSource/Vertex.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export class Vertex 4 | { 5 | public coord : Vec2; 6 | public drawName : boolean = true; //toggle for name display; 7 | 8 | private _name : string; 9 | 10 | public get name() : string //for display 11 | { 12 | return this._name; 13 | } 14 | 15 | public set name(inName : string) 16 | { 17 | this._name = inName ? inName.toLowerCase() : inName; 18 | } 19 | 20 | constructor(inCoord : Vec2, inName : string) 21 | { 22 | this.coord = inCoord.Clone(); 23 | this.name = inName; 24 | } 25 | 26 | public Draw(deltaMs : number, coord : Coordinate, context : CanvasRenderingContext2D) : void 27 | { 28 | if(!this.drawName) 29 | { 30 | return; 31 | } 32 | let pos = coord.GetCanvasPosByCoord(this.coord); 33 | context.font = "30px Arial"; 34 | context.fillStyle = "#000000FF"; 35 | context.fillText(this.name + "(" + numToString(this.coord.x, 2) + "," + numToString(this.coord.y, 2) + ")", pos.x, pos.y); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /TsSource/main.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | let draggingConvexObj : Convex = null; 4 | let draggingConvexObjDisableCounter : number = 0; 5 | 6 | export function GetCurrentDraggingConvexObj() : Readonly 7 | { 8 | return draggingConvexObj; 9 | } 10 | 11 | export function DisableDraggingConvexObj() 12 | { 13 | ++draggingConvexObjDisableCounter; 14 | } 15 | 16 | export function EnableDraggingConvexObj() 17 | { 18 | --draggingConvexObjDisableCounter; 19 | } 20 | 21 | window.onload = function() 22 | { 23 | let canvas = document.getElementById('canvas') as 24 | HTMLCanvasElement; 25 | let framework = new Framework(canvas); 26 | 27 | /////////////////////Default Convex Objects//////////////////// 28 | let conv = new Polygon(); 29 | conv.AddVertex(new Vertex(new Vec2(6, 8), "a")); 30 | conv.AddVertex(new Vertex(new Vec2(5, 2), "b")); 31 | conv.AddVertex(new Vertex(new Vec2(1, 6), "c")); 32 | conv.name = "A"; 33 | framework.AddConvex(conv); 34 | 35 | 36 | conv = new Polygon(); 37 | conv.AddVertex(new Vertex(new Vec2(6, 4), "d")); 38 | conv.AddVertex(new Vertex(new Vec2(2, 2), "e")); 39 | conv.AddVertex(new Vertex(new Vec2(5, -2), "f")); 40 | conv.name = "B"; 41 | framework.AddConvex(conv); 42 | /////////////////////Default Convex Objects//////////////////// 43 | 44 | /////////////////////Custom Convex Functions//////////////////// 45 | let addTypeSelector = (document.getElementById('ConvexType') as HTMLSelectElement); 46 | let buttonClear = document.getElementById('ClearAllConvex'); 47 | let buttonBeginAdd = document.getElementById('BeginAddNewConvex'); 48 | let buttonFinishAdd = document.getElementById('FinishAddNewConvex'); 49 | let buttonCancel = document.getElementById('CancelAddNewConvex'); 50 | 51 | InitShowCase_DrawCustomConvex(framework, canvas, buttonClear, buttonBeginAdd, buttonFinishAdd, buttonCancel, addTypeSelector); 52 | /////////////////////Custom Convex Functions//////////////////// 53 | 54 | 55 | 56 | /////////////////////Full Minkowski Difference Preview//////////////////// 57 | let buttonToggleMinkowskiDiff = document.getElementById("MinkowskiDiffToggle"); 58 | InitShowCase_MinkowskiDiff(framework, buttonToggleMinkowskiDiff); 59 | /////////////////////Full Minkowski Difference Preview//////////////////// 60 | 61 | 62 | //////////////////////GJK Step Demonstration//////////////////////////// 63 | let buttonGJKStep = document.getElementById("GJKStep"); 64 | let buttonGJKUndo = document.getElementById("GJKUndoStep"); 65 | let buttonGJKClear = document.getElementById("GJKClear"); 66 | InitShowCase_DrawGJKStep(framework, canvas, buttonGJKStep, buttonGJKUndo, buttonGJKClear); 67 | //////////////////////GJK Step Demonstration//////////////////////////// 68 | 69 | 70 | //////////////////////EPA Demonstration//////////////////////////// 71 | let buttonEPAStep = document.getElementById("EPAStep"); 72 | let buttonEPAUndo = document.getElementById("EPAUndoStep"); 73 | let buttonEPAClear = document.getElementById("EPAClear"); 74 | let buttonEPAPushOutToggle = document.getElementById("EPAPushOutToggle"); 75 | InitShowCase_DrawEPAStep(framework, canvas, buttonEPAStep, buttonEPAUndo, buttonEPAClear, buttonEPAPushOutToggle); 76 | //////////////////////GJK Step Demonstration//////////////////////////// 77 | 78 | 79 | /////////////////////GJK Raycast Demonstration/////////////////////// 80 | let buttonGJKRaycastStep = document.getElementById("GJKRaycastStep"); 81 | let buttonGJKRaycastUndo = document.getElementById("GJKRaycastUndoStep"); 82 | let buttonGJKRaycastClear = document.getElementById("GJKRaycastClear"); 83 | let buttonGJKRaycastRuntime = document.getElementById("GJKRaycastRuntime"); 84 | InitShowCase_DrawGJKRaycastStep(framework, canvas, buttonGJKRaycastStep, buttonGJKRaycastUndo, buttonGJKRaycastClear, buttonGJKRaycastRuntime); 85 | /////////////////////GJK Raycast Demonstration/////////////////////// 86 | 87 | 88 | /////////////////////////Drag Convex/////////////////////////////////// 89 | { 90 | let bDrag = false; 91 | let lastCood : Vec2 = null; 92 | canvas.addEventListener('mousedown', (evt)=>{ 93 | if(evt.button != 1) 94 | { 95 | return; 96 | } 97 | event.preventDefault(); 98 | bDrag = true; 99 | 100 | let pos = new Vec2(evt.offsetX, evt.offsetY); 101 | lastCood = framework.GetCoordinate().GetCoordByCanvasPos(pos); 102 | for(let i = 0; i < framework.GetConvexObjsCount(); ++i) 103 | { 104 | let candidiateConvex = framework.GetConvex(i); 105 | if(candidiateConvex.IsPointInConvex(lastCood)) 106 | { 107 | draggingConvexObj = candidiateConvex; 108 | break; 109 | } 110 | } 111 | }); 112 | 113 | canvas.addEventListener('mousemove', (evt)=>{ 114 | if(!bDrag || !draggingConvexObj || draggingConvexObjDisableCounter > 0) 115 | { 116 | return; 117 | } 118 | let pos = new Vec2(evt.offsetX, evt.offsetY); 119 | let coord = framework.GetCoordinate().GetCoordByCanvasPos(pos); 120 | draggingConvexObj.Translate(coord.Sub(lastCood)); 121 | lastCood = coord; 122 | }); 123 | 124 | canvas.addEventListener('mouseup', (evt)=>{ 125 | if(evt.button != 1) 126 | { 127 | return; 128 | } 129 | event.preventDefault(); 130 | bDrag = false; 131 | draggingConvexObj = null; 132 | }); 133 | } 134 | ////////////////////////////////////////////////////////////////////// 135 | /////////////////////Paint Tools/////////////////////// 136 | InitShowCase_Paint(framework, canvas, 137 | document.getElementById("strokeColors"), 138 | document.getElementById("fillColors"), 139 | document.getElementById("lineThick"), 140 | document.getElementById("lineMedium"), 141 | document.getElementById("lineThin"), 142 | document.getElementById("SolidLine"), 143 | document.getElementById("DashLine"), 144 | document.getElementById("disablePaint"), 145 | document.getElementById("drawLine"), 146 | document.getElementById("drawCircle"), 147 | document.getElementById("drawRectangle"), 148 | document.getElementById("drawArrow"), 149 | document.getElementById("undoPaint"), 150 | document.getElementById("clearPaint"), 151 | ); 152 | /////////////////////Paint Tools/////////////////////// 153 | }; 154 | } -------------------------------------------------------------------------------- /TsSource/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "ansi-font": { 6 | "version": "0.0.2", 7 | "resolved": "https://registry.npmjs.org/ansi-font/-/ansi-font-0.0.2.tgz", 8 | "integrity": "sha1-iQMBvVhBRi/TnAt3Ca/R9SUUMzE=" 9 | }, 10 | "commonjs": { 11 | "version": "0.0.1", 12 | "resolved": "https://registry.npmjs.org/commonjs/-/commonjs-0.0.1.tgz", 13 | "integrity": "sha1-ZcUx3P9lZcp8ld38lmIricwClNU=", 14 | "requires": { 15 | "system": ">=0.0.1", 16 | "test": ">=0.0.5" 17 | } 18 | }, 19 | "system": { 20 | "version": "2.0.1", 21 | "resolved": "https://registry.npmjs.org/system/-/system-2.0.1.tgz", 22 | "integrity": "sha512-BwSUSa8LMHZouGadZ34ck3TsrH5s3oMmTKPK+xHdbBnTCZOZMJ38fHGKLAHkBl0PXru1Z4BsymQU4qqvTxWzdQ==" 23 | }, 24 | "test": { 25 | "version": "0.6.0", 26 | "resolved": "https://registry.npmjs.org/test/-/test-0.6.0.tgz", 27 | "integrity": "sha1-WYasRF7Bd1QyJRLRBLoyyKY+k44=", 28 | "requires": { 29 | "ansi-font": "0.0.2" 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /TsSource/test.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | class Vec3 5 | { 6 | X : number; 7 | Y : number; 8 | Z : number; 9 | 10 | static Zero : Vec3 = new Vec3(); 11 | 12 | public Sub(rhs : Vec3) 13 | { 14 | return rhs; 15 | } 16 | public Add(rhs : Vec3) 17 | { 18 | return rhs; 19 | } 20 | public Mul(rhs : number) : Vec3 21 | { 22 | return this; 23 | } 24 | } 25 | 26 | class OBB 27 | { 28 | extend : Vec3; 29 | 30 | public TransToLocal(point : Vec3) : Vec3 31 | { 32 | return point; 33 | } 34 | 35 | public TransToGlobal(point : Vec3) : Vec3 36 | { 37 | return point; 38 | } 39 | } 40 | 41 | class AABB 42 | { 43 | extend : Vec3; 44 | 45 | constructor(ext : Vec3) 46 | { 47 | this.extend = ext; 48 | } 49 | } 50 | 51 | function RaycastOBB(obb : OBB, startPoint : Vec3, dir : Vec3, distance : number): {collided : boolean, hitPoint : Vec3, normal : Vec3, distance : number} 52 | { 53 | return {collided : true, hitPoint : null, normal : null, distance : 0} 54 | } 55 | 56 | function MoveAloneDir(dir : Vec3, normal : Vec3) : Vec3 57 | { 58 | return dir; 59 | } 60 | 61 | function Move(startPoint : Vec3, dir : Vec3, distance : number, collision : OBB) : Vec3 62 | { 63 | let currentPos = startPoint; 64 | let currentDir = dir; 65 | let maxIterate = 3; 66 | let leftDistance = distance; 67 | while(leftDistance > 0 && maxIterate-- >= 0) 68 | { 69 | let raycastResult = RaycastOBB(collision, startPoint, dir, leftDistance); 70 | if(!raycastResult.collided) 71 | { 72 | return currentPos.Add(currentDir.Mul(leftDistance)); 73 | } 74 | currentPos = raycastResult.hitPoint; 75 | leftDistance -= raycastResult.distance; 76 | currentDir = MoveAloneDir(currentDir, raycastResult.normal); 77 | } 78 | return currentPos; 79 | } -------------------------------------------------------------------------------- /TsSource/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "sourceMap": true, 5 | "lib": [ "dom", "es6"], 6 | "noUnusedLocals": true, 7 | "outDir": "../build/" 8 | } 9 | } -------------------------------------------------------------------------------- /TsSource/vec2.ts: -------------------------------------------------------------------------------- 1 | module GJKTutorial 2 | { 3 | export class Vec2 4 | { 5 | public x : number = 0; 6 | public y : number = 0; 7 | 8 | constructor(_x : number = 0, _y : number = 0) 9 | { 10 | this.x = _x; 11 | this.y = _y; 12 | } 13 | 14 | public get magnitude() : number 15 | { 16 | return Math.sqrt(this.x * this.x + this.y * this.y); 17 | } 18 | 19 | public get magnitudeSqr() : number 20 | { 21 | return this.x * this.x + this.y * this.y; 22 | } 23 | 24 | public Add (rhs : Vec2) : Vec2 25 | { 26 | return new Vec2(this.x + rhs.x, this.y + rhs.y); 27 | } 28 | 29 | public Sub (rhs : Vec2) : Vec2 30 | { 31 | return new Vec2(this.x - rhs.x, this.y - rhs.y); 32 | } 33 | 34 | public Mul(mul : number) : Vec2 35 | { 36 | return new Vec2(this.x * mul, this.y * mul); 37 | } 38 | 39 | public Div(mul : number) : Vec2 40 | { 41 | return new Vec2(this.x / mul, this.y / mul); 42 | } 43 | 44 | public Dot (rhs : Vec2) : number 45 | { 46 | return this.x * rhs.x + this.y * rhs.y; 47 | } 48 | 49 | public Cross(rhs : Vec2) : number 50 | { 51 | return this.x * rhs.y - this.y * rhs.x; 52 | } 53 | 54 | public Equals(rhs : Vec2) : boolean 55 | { 56 | return (Math.abs(this.x - rhs.x) < Number.EPSILON) && (Math.abs(this.y - rhs.y) < Number.EPSILON); 57 | } 58 | 59 | public Clone() : Vec2 60 | { 61 | return new Vec2(this.x, this.y); 62 | } 63 | 64 | public RotateCW(degree : number) : Vec2 65 | { 66 | let radian = degree / 180 * Math.PI; 67 | let sin = Math.sin(-radian); 68 | let cos = Math.cos(-radian); 69 | return new Vec2(this.x * cos - this.y * sin, this.x * sin + this.y * cos); 70 | } 71 | 72 | /// 0 - 360 73 | public GetDegreeToCW(toVec : Vec2) : number 74 | { 75 | let thisMag = this.magnitude; 76 | let toMag = toVec.magnitude; 77 | if(thisMag == 0 || toMag == 0) 78 | { 79 | return 0; 80 | } 81 | let cosine = this.Dot(toVec) / (thisMag * toMag); 82 | 83 | let radian = Math.acos(cosine); 84 | 85 | if(this.Cross(toVec) > 0) 86 | { 87 | radian = 2 * Math.PI - radian; 88 | } 89 | return radian * 360 / (2 * Math.PI); 90 | } 91 | 92 | public toString() : string 93 | { 94 | return "{" + this.x + "," + this.y + "}"; 95 | } 96 | 97 | public Normalize() : Vec2 98 | { 99 | let magnitude = this.magnitude; 100 | if(magnitude == 0) 101 | { 102 | return new Vec2(); 103 | } 104 | return this.Div(magnitude); 105 | } 106 | } 107 | } -------------------------------------------------------------------------------- /build/Capsule.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Capsule extends GJKTutorial.Convex { 4 | constructor(p0, p1, radius) { 5 | super(); 6 | this.p0 = new GJKTutorial.Vec2(0, 0); 7 | this.p1 = new GJKTutorial.Vec2(0, 0); 8 | this.radius = 1; 9 | this.GetP0 = function () { 10 | return this.p0; 11 | }; 12 | this.GetP1 = function () { 13 | return this.p1; 14 | }; 15 | this.GetRadius = function () { 16 | return this.radius; 17 | }; 18 | this.p0 = p0.Clone(); 19 | this.p1 = p1.Clone(); 20 | this.radius = radius; 21 | } 22 | Translate(offset) { 23 | this.p0 = this.p0.Add(offset); 24 | this.p1 = this.p1.Add(offset); 25 | } 26 | IsPointInConvex(point) { 27 | return GJKTutorial.PointDistanceToSegmentSqr(point, this.p0, this.p1) <= this.radius * this.radius; 28 | } 29 | GetCenterCoord() { 30 | return this.p0.Add(this.p1).Div(2); 31 | } 32 | Support(dir) { 33 | let dotP0 = this.p0.Dot(dir); 34 | let dotP1 = this.p1.Dot(dir); 35 | if (dotP0 > dotP1) { 36 | return new GJKTutorial.Vertex(this.p0.Add(dir.Normalize().Mul(this.radius)), this.name); 37 | } 38 | else { 39 | return new GJKTutorial.Vertex(this.p1.Add(dir.Normalize().Mul(this.radius)), this.name); 40 | } 41 | } 42 | Draw(deltaMs, coord, context, strokeColor, fillColor) { 43 | let radius = coord.GetCanvasPosByCoord(new GJKTutorial.Vec2(0, this.radius)).Sub(coord.GetCanvasPosByCoord(new GJKTutorial.Vec2(0, 0))).magnitude; 44 | context.lineWidth = 0.8; 45 | context.strokeStyle = strokeColor; 46 | let p0Pos = coord.GetCanvasPosByCoord(this.p0); 47 | let p1Pos = coord.GetCanvasPosByCoord(this.p1); 48 | let dir = p1Pos.Sub(p0Pos); 49 | let radiusDir = new GJKTutorial.Vec2(-dir.y, dir.x); 50 | radiusDir = radiusDir.Normalize().Mul(radius); 51 | let p0ArcStart = p0Pos.Add(radiusDir); 52 | let p1ArcStart = p1Pos.Sub(radiusDir); 53 | let Arc0StartAngle = Math.acos(radiusDir.x / radius); 54 | if (dir.x < 0) { 55 | Arc0StartAngle = Math.PI * 2 - Arc0StartAngle; 56 | } 57 | context.beginPath(); 58 | context.moveTo(p0ArcStart.x, p0ArcStart.y); 59 | context.arc(p0Pos.x, p0Pos.y, radius, Arc0StartAngle, Arc0StartAngle + Math.PI, false); 60 | context.lineTo(p1ArcStart.x, p1ArcStart.y); 61 | context.arc(p1Pos.x, p1Pos.y, radius, Arc0StartAngle + Math.PI, Arc0StartAngle + Math.PI + Math.PI, false); 62 | context.lineTo(p0ArcStart.x, p0ArcStart.y); 63 | context.stroke(); 64 | context.closePath(); 65 | context.fillStyle = fillColor; 66 | context.fill(); 67 | } 68 | } 69 | GJKTutorial.Capsule = Capsule; 70 | })(GJKTutorial || (GJKTutorial = {})); 71 | //# sourceMappingURL=Capsule.js.map -------------------------------------------------------------------------------- /build/Capsule.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Capsule.js","sourceRoot":"","sources":["../TsSource/Capsule.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /build/Circle.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Circle extends GJKTutorial.Convex { 4 | constructor(centerPos, radius) { 5 | super(); 6 | this.center = new GJKTutorial.Vec2(0, 0); 7 | this.radius = 1; 8 | this.GetCenter = function () { 9 | return this.center; 10 | }; 11 | this.GetRadius = function () { 12 | return this.radius; 13 | }; 14 | this.center = centerPos; 15 | this.radius = radius; 16 | } 17 | Translate(offset) { 18 | this.center = this.center.Add(offset); 19 | } 20 | IsPointInConvex(point) { 21 | return point.Sub(this.center).magnitudeSqr <= this.radius * this.radius; 22 | } 23 | GetCenterCoord() { 24 | return this.center; 25 | } 26 | Support(dir) { 27 | return new GJKTutorial.Vertex(this.center.Add(dir.Normalize().Mul(this.radius)), this.name); 28 | } 29 | Draw(deltaMs, coord, context, strokeColor, fillColor) { 30 | let centerPos = coord.GetCanvasPosByCoord(this.center); 31 | let radius = coord.GetCanvasPosByCoord(new GJKTutorial.Vec2(0, this.radius)).Sub(coord.GetCanvasPosByCoord(new GJKTutorial.Vec2(0, 0))).magnitude; 32 | context.beginPath(); 33 | context.arc(centerPos.x, centerPos.y, 4, 0, 2 * Math.PI, false); 34 | context.fillStyle = 'black'; 35 | context.fill(); 36 | context.closePath(); 37 | context.beginPath(); 38 | context.lineWidth = 0.8; 39 | context.strokeStyle = strokeColor; 40 | context.arc(centerPos.x, centerPos.y, radius, 0, 2 * Math.PI, false); 41 | context.stroke(); 42 | context.closePath(); 43 | context.fillStyle = fillColor; 44 | context.fill(); 45 | if (this.drawName && this.name) { 46 | context.fillStyle = 'black'; 47 | context.font = "40px Arial"; 48 | context.fillText(this.name, centerPos.x, centerPos.y); 49 | } 50 | } 51 | } 52 | GJKTutorial.Circle = Circle; 53 | })(GJKTutorial || (GJKTutorial = {})); 54 | //# sourceMappingURL=Circle.js.map -------------------------------------------------------------------------------- /build/Circle.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Circle.js","sourceRoot":"","sources":["../TsSource/Circle.ts"],"names":[],"mappings":"AAAA,IAAO,WAAW,CAyEjB;AAzED,WAAO,WAAW;IAEd,MAAa,MAAO,SAAQ,YAAA,MAAM;QAK9B,YAAmB,SAAgB,EAAE,MAAe;YAEhD,KAAK,EAAE,CAAC;YALJ,WAAM,GAAU,IAAI,YAAA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,WAAM,GAAY,CAAC,CAAC;YAeZ,cAAS,GAAG;gBAExB,OAAO,IAAI,CAAC,MAAM,CAAC;YACvB,CAAC,CAAA;YAGe,cAAS,GAAG;gBAExB,OAAO,IAAI,CAAC,MAAM,CAAC;YACvB,CAAC,CAAA;YAnBG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC;QAEM,SAAS,CAAC,MAAa;YAE1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAcM,eAAe,CAAC,KAAY;YAE/B,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5E,CAAC;QAEM,cAAc;YAEjB,OAAO,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;QAEM,OAAO,CAAC,GAAU;YAErB,OAAO,IAAI,YAAA,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpF,CAAC;QAEM,IAAI,CAAC,OAAgB,EAAE,KAAkB,EAAE,OAAkC,EAAE,WAAoB,EAAE,SAAkB;YAE1H,IAAI,SAAS,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,MAAM,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,YAAA,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,YAAA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE1H,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;YAC5B,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,SAAS,EAAE,CAAC;YAEpB,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;YACxB,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACrE,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;YAC9B,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE;gBAC5B,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;gBAC5B,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;aACzD;QACL,CAAC;KACJ;IAtEY,kBAAM,SAsElB,CAAA;AACL,CAAC,EAzEM,WAAW,KAAX,WAAW,QAyEjB"} -------------------------------------------------------------------------------- /build/Convex.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Convex { 4 | constructor() { 5 | this.drawName = true; //toggle for name display; 6 | this.fillColor = "#ffffffff"; 7 | } 8 | get name() { 9 | return this._name; 10 | } 11 | set name(inName) { 12 | this._name = inName ? inName.toUpperCase() : inName; 13 | } 14 | } 15 | GJKTutorial.Convex = Convex; 16 | })(GJKTutorial || (GJKTutorial = {})); 17 | //# sourceMappingURL=Convex.js.map -------------------------------------------------------------------------------- /build/Convex.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Convex.js","sourceRoot":"","sources":["../TsSource/Convex.ts"],"names":[],"mappings":"AAAA,IAAO,WAAW,CAiCjB;AAjCD,WAAO,WAAW;IAEd,MAAsB,MAAM;QAA5B;YAEW,aAAQ,GAAa,IAAI,CAAC,CAAE,0BAA0B;YACtD,cAAS,GAAY,WAAW,CAAC;QA2B5C,CAAC;QAxBG,IAAW,IAAI;YAEX,OAAO,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,IAAW,IAAI,CAAC,MAAe;YAE3B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,CAAC;KAgBJ;IA9BqB,kBAAM,SA8B3B,CAAA;AACL,CAAC,EAjCM,WAAW,KAAX,WAAW,QAiCjB"} -------------------------------------------------------------------------------- /build/Coordinate.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Coordinate { 4 | constructor(inCanvas) { 5 | this.imageCache = null; 6 | this._coordXMax = 16.5; 7 | this._coordYMax = 16.5; 8 | this.canvas = inCanvas; 9 | } 10 | get canvasWidth() { 11 | return this.canvas.height; 12 | } 13 | get canvasHeight() { 14 | return this.canvas.height; 15 | } 16 | get coordXMax() { 17 | return this._coordXMax; 18 | } 19 | get coordYMax() { 20 | return this._coordYMax; 21 | } 22 | set coordXMax(xMax) { 23 | this._coordXMax = xMax; 24 | this.imageCache = null; 25 | } 26 | set coordYMax(yMax) { 27 | this._coordYMax = yMax; 28 | this.imageCache = null; 29 | } 30 | GetCanvasPosByCoord(coord) { 31 | return new GJKTutorial.Vec2(this.canvasWidth / 2 * coord.x / this.coordXMax + this.canvasWidth / 2, this.canvasHeight / 2 - this.canvasHeight / 2 * coord.y / this.coordYMax); 32 | } 33 | GetCoordByCanvasPos(pos) { 34 | return new GJKTutorial.Vec2(pos.x / this.canvasWidth * this.coordXMax * 2 - this.coordXMax, this.coordYMax - pos.y / this.canvasHeight * this.coordYMax * 2); 35 | } 36 | Draw(deltaMs, context) { 37 | if (this.imageCache) { 38 | context.putImageData(this.imageCache, 0, 0); 39 | return; 40 | } 41 | //Draw X and Y Axis 42 | context.beginPath(); 43 | let coordXMin_Pos = this.GetCanvasPosByCoord(new GJKTutorial.Vec2(-this.coordXMax, 0)); 44 | let coordXMan_Pos = this.GetCanvasPosByCoord(new GJKTutorial.Vec2(this.coordXMax, 0)); 45 | let coordYMin_Pos = this.GetCanvasPosByCoord(new GJKTutorial.Vec2(0, -this.coordYMax)); 46 | let coordYMax_Pos = this.GetCanvasPosByCoord(new GJKTutorial.Vec2(0, this.coordYMax)); 47 | context.lineWidth = 2; 48 | context.strokeStyle = 'black'; 49 | context.moveTo(coordXMin_Pos.x, coordXMin_Pos.y); 50 | context.lineTo(coordXMan_Pos.x, coordXMan_Pos.y); 51 | context.moveTo(coordYMin_Pos.x, coordYMin_Pos.y); 52 | context.lineTo(coordYMax_Pos.x, coordYMax_Pos.y); 53 | context.stroke(); 54 | context.closePath(); 55 | //Draw Coord Grids 56 | context.lineWidth = 0.5; 57 | context.setLineDash([3, 6]); 58 | context.strokeStyle = "#00ff00"; 59 | context.beginPath(); 60 | let xInt = Math.floor(this.coordXMax); 61 | let yInt = Math.floor(this.coordYMax); 62 | for (let x = -xInt; x <= xInt; ++x) { 63 | if (x == 0) { 64 | continue; 65 | } 66 | let minPos = this.GetCanvasPosByCoord(new GJKTutorial.Vec2(x, -this.coordYMax)); 67 | let maxPos = this.GetCanvasPosByCoord(new GJKTutorial.Vec2(x, this.coordYMax)); 68 | context.moveTo(minPos.x, minPos.y); 69 | context.lineTo(maxPos.x, maxPos.y); 70 | } 71 | for (let y = -yInt; y <= yInt; ++y) { 72 | if (y == 0) { 73 | continue; 74 | } 75 | let minPos = this.GetCanvasPosByCoord(new GJKTutorial.Vec2(-this.coordXMax, y)); 76 | let maxPos = this.GetCanvasPosByCoord(new GJKTutorial.Vec2(this.coordXMax, y)); 77 | context.moveTo(minPos.x, minPos.y); 78 | context.lineTo(maxPos.x, maxPos.y); 79 | } 80 | context.stroke(); 81 | context.closePath(); 82 | context.setLineDash([]); 83 | this.imageCache = context.getImageData(0, 0, this.canvasWidth, this.canvasHeight); 84 | } 85 | } 86 | GJKTutorial.Coordinate = Coordinate; 87 | })(GJKTutorial || (GJKTutorial = {})); 88 | //# sourceMappingURL=Coordinate.js.map -------------------------------------------------------------------------------- /build/Coordinate.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Coordinate.js","sourceRoot":"","sources":["../TsSource/Coordinate.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /build/Framework.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Framework { 4 | constructor(inCanvas) { 5 | this.convexObjs = []; 6 | this.convexCounter = 0; 7 | this.convexFillColors = ['#8e232244', '#2387ff44']; 8 | this.customDrawsBeforeDrawConvex = []; 9 | this.customDrawsAfterDrawConvex = []; 10 | this.customDrawsFinal = []; 11 | this.leftMouseDown = null; 12 | this.leftMouseMove = null; 13 | this.leftMouseUp = null; 14 | this.canvas = inCanvas; 15 | this.context = this.canvas.getContext("2d"); 16 | this.coord = new GJKTutorial.Coordinate(this.canvas); 17 | let lastUpdateTime = Date.now(); 18 | setInterval(() => { 19 | let currentTime = Date.now(); 20 | this.update(currentTime - lastUpdateTime); 21 | lastUpdateTime = currentTime; 22 | }, 16); 23 | let isLeftMouseDown = false; 24 | this.canvas.addEventListener('mousedown', (evt) => { 25 | if (this.leftMouseDown && evt.button == 0) { 26 | isLeftMouseDown = true; 27 | this.leftMouseDown(evt); 28 | } 29 | }); 30 | this.canvas.addEventListener('mouseup', (evt) => { 31 | if (this.leftMouseUp && evt.button == 0) { 32 | isLeftMouseDown = false; 33 | this.leftMouseUp(evt); 34 | } 35 | }); 36 | this.canvas.addEventListener('mousemove', (evt) => { 37 | if (this.leftMouseMove && isLeftMouseDown) { 38 | this.leftMouseMove(evt); 39 | } 40 | }); 41 | this.canvas.addEventListener("wheel", (evt) => { 42 | if (this.canvas.width < evt.offsetX || this.canvas.height < evt.offsetY) { 43 | return; 44 | } 45 | this.coord.coordXMax += evt.deltaY / 100; 46 | this.coord.coordYMax += evt.deltaY / 100; 47 | evt.preventDefault(); 48 | }); 49 | } 50 | update(deltaMs) { 51 | this.ClearCanvas(); 52 | this.DrawCoordinate(deltaMs); 53 | this.customDrawsBeforeDrawConvex.forEach(element => { 54 | element(deltaMs, this.coord, this.context); 55 | }); 56 | this.DrawConvexObjs(deltaMs); 57 | this.customDrawsAfterDrawConvex.forEach(element => { 58 | element(deltaMs, this.coord, this.context); 59 | }); 60 | this.customDrawsFinal.forEach(element => { 61 | element(deltaMs, this.coord, this.context); 62 | }); 63 | if (this.convexObjs.length == 2) { 64 | if (GJKTutorial.GJKTest(this.convexObjs[0], this.convexObjs[1]) != null) { 65 | this.context.fillRect(0, 0, 20, 20); 66 | } 67 | } 68 | } 69 | RegisterLeftMouseEvent(mouseDown, mouseMove, mouseUp) { 70 | this.leftMouseDown = mouseDown; 71 | this.leftMouseMove = mouseMove; 72 | this.leftMouseUp = mouseUp; 73 | } 74 | UnRegisterLeftMouseEvent(mouseDown, mouseMove, mouseUp) { 75 | if (this.leftMouseDown == mouseDown) { 76 | this.leftMouseDown = null; 77 | } 78 | if (this.leftMouseUp == mouseUp) { 79 | this.leftMouseUp = null; 80 | } 81 | if (this.leftMouseMove == mouseMove) { 82 | this.leftMouseMove = null; 83 | } 84 | } 85 | AddCustomDrawFunctionBeforeDrawConvex(func) { 86 | this.customDrawsBeforeDrawConvex.push(func); 87 | } 88 | RmvCustomDrawFunctionBeforeDrawConvex(func) { 89 | let index = this.customDrawsBeforeDrawConvex.indexOf(func); 90 | if (index >= 0) { 91 | this.customDrawsBeforeDrawConvex.splice(index, 1); 92 | } 93 | } 94 | AddCustomDrawFunctionAfterDrawConvex(func) { 95 | this.customDrawsAfterDrawConvex.push(func); 96 | } 97 | RmvCustomDrawFunctionAfterDrawConvex(func) { 98 | let index = this.customDrawsAfterDrawConvex.indexOf(func); 99 | if (index >= 0) { 100 | this.customDrawsAfterDrawConvex.splice(index, 1); 101 | } 102 | } 103 | AddCustomDrawFunctionFinal(func) { 104 | this.customDrawsFinal.push(func); 105 | } 106 | RmvCustomDrawFunctionFinal(func) { 107 | let index = this.customDrawsFinal.indexOf(func); 108 | if (index >= 0) { 109 | this.customDrawsFinal.splice(index, 1); 110 | } 111 | } 112 | GetCoordinate() { 113 | return this.coord; 114 | } 115 | ClearCanvas() { 116 | this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); 117 | } 118 | DrawCoordinate(deltaMs) { 119 | this.coord.Draw(deltaMs, this.context); 120 | } 121 | DrawConvexObjs(deltaMs) { 122 | for (let i = 0; i < this.convexObjs.length; ++i) { 123 | this.convexObjs[i].Draw(deltaMs, this.coord, this.context, 'black', this.convexObjs[i].fillColor); 124 | } 125 | } 126 | GetConvexObjsCount() { 127 | return this.convexObjs.length; 128 | } 129 | GetConvex(index) { 130 | return this.convexObjs[index]; 131 | } 132 | //We always use (A - B) to calculate Minkowski Difference 133 | GetConvexAB() { 134 | if (this.convexObjs.length != 2) { 135 | return null; 136 | } 137 | let convexObjs = [this.convexObjs[0], this.convexObjs[1]]; 138 | convexObjs.sort((a, b) => { 139 | return GJKTutorial.EncodeCustomCharCode(a.name) - GJKTutorial.EncodeCustomCharCode(b.name); 140 | }); 141 | return { A: convexObjs[0], B: convexObjs[1] }; 142 | } 143 | //the maximum number of convex objects is 2; 144 | AddConvex(convex) { 145 | this.convexObjs.push(convex); 146 | convex.fillColor = this.convexFillColors[this.convexCounter % this.convexFillColors.length]; 147 | ++this.convexCounter; 148 | if (this.convexObjs.length > 2) { 149 | this.convexObjs.splice(0, 1); 150 | } 151 | } 152 | RemoveConvex(convex) { 153 | if (convex instanceof GJKTutorial.Convex) { 154 | let index = this.convexObjs.indexOf(convex); 155 | if (index >= 0) { 156 | this.convexObjs.splice(index, 1); 157 | } 158 | } 159 | else { 160 | this.convexObjs.splice(convex, 1); 161 | } 162 | } 163 | } 164 | GJKTutorial.Framework = Framework; 165 | })(GJKTutorial || (GJKTutorial = {})); 166 | //# sourceMappingURL=Framework.js.map -------------------------------------------------------------------------------- /build/Framework.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Framework.js","sourceRoot":"","sources":["../TsSource/Framework.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /build/Polygon.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Polygon extends GJKTutorial.Convex { 4 | constructor() { 5 | super(...arguments); 6 | this.vertices = []; 7 | } 8 | AddVertex(vertex) { 9 | this.vertices.push(vertex); 10 | } 11 | RemoveVertex(index) { 12 | this.vertices.splice(index, 1); 13 | } 14 | SetVertices(vertices) { 15 | this.vertices = [...vertices]; 16 | } 17 | GetVertices() { 18 | return this.vertices; 19 | } 20 | Translate(offset) { 21 | for (let i = 0; i < this.vertices.length; ++i) { 22 | this.vertices[i].coord = this.vertices[i].coord.Add(offset); 23 | } 24 | } 25 | //re-order the vertices, try to make this polygon convex(CW order). 26 | ReOrder() { 27 | let verticesTmp = [...this.vertices]; 28 | let newVerticesTmp = []; 29 | if (verticesTmp.length < 3) { 30 | return; 31 | } 32 | let firstVertexIndex = -1; 33 | let minX = Number.MAX_SAFE_INTEGER; 34 | let maxY = Number.MIN_SAFE_INTEGER; 35 | for (let i = 0; i < verticesTmp.length; ++i) { 36 | if (verticesTmp[i].coord.x < minX 37 | || (verticesTmp[i].coord.x == minX && verticesTmp[i].coord.y > maxY)) { 38 | minX = verticesTmp[i].coord.x; 39 | maxY = verticesTmp[i].coord.y; 40 | firstVertexIndex = i; 41 | } 42 | } 43 | newVerticesTmp.push(verticesTmp.splice(firstVertexIndex, 1)[0]); 44 | let startVertex = newVerticesTmp[0]; 45 | let upDir = new GJKTutorial.Vec2(0, 1); 46 | verticesTmp.sort((a, b) => { 47 | let dirA = a.coord.Sub(startVertex.coord); 48 | let dirB = b.coord.Sub(startVertex.coord); 49 | let magnitudeA = dirA.magnitude; 50 | let magnitudeB = dirB.magnitude; 51 | if (magnitudeA == 0) { 52 | return -1; 53 | } 54 | else if (magnitudeB == 0) { 55 | return 1; 56 | } 57 | dirA = dirA.Normalize(); 58 | dirB = dirB.Normalize(); 59 | let dotA = upDir.Dot(dirA); 60 | let dotB = upDir.Dot(dirB); 61 | if (dotA != dotB) { 62 | return dotB - dotA; 63 | } 64 | if (a.coord.y >= startVertex.coord.y) { 65 | return magnitudeA - magnitudeB; 66 | } 67 | else { 68 | return magnitudeB - magnitudeA; 69 | } 70 | return 1; 71 | }); 72 | newVerticesTmp.push(...verticesTmp); 73 | this.vertices = newVerticesTmp; 74 | } 75 | Rebuild() { 76 | this.vertices = GJKTutorial.GetConvexFromVertices(this.vertices); 77 | } 78 | IsConvex() { 79 | if (this.vertices.length < 3) { 80 | return false; 81 | } 82 | let lastCross = 0; 83 | for (let i = 0; i < this.vertices.length; ++i) { 84 | let point = this.vertices[i]; 85 | let point_prev = this.vertices[(i - 1 + this.vertices.length) % this.vertices.length]; 86 | let point_next = this.vertices[(i + 1) % this.vertices.length]; 87 | let vector1 = point.coord.Sub(point_prev.coord); 88 | let vector2 = point_next.coord.Sub(point.coord); 89 | let cross = vector1.Cross(vector2); 90 | if (lastCross == 0) { 91 | lastCross = cross; 92 | } 93 | else if (cross != 0) { 94 | if (cross * lastCross < 0) { 95 | return false; 96 | } 97 | lastCross = cross; 98 | } 99 | } 100 | return true; 101 | } 102 | IsPointInConvex(point) { 103 | if (this.vertices.length < 3) { 104 | return false; 105 | } 106 | let lastCross = 0; 107 | for (let i = 0; i < this.vertices.length; ++i) { 108 | let point_current = this.vertices[i]; 109 | let point_next = this.vertices[(i + 1) % this.vertices.length]; 110 | let vector1 = point_next.coord.Sub(point_current.coord); 111 | let vector2 = point.Sub(point_current.coord); 112 | let cross = vector1.Cross(vector2); 113 | if (lastCross == 0) { 114 | lastCross = cross; 115 | } 116 | else if (cross != 0) { 117 | if (cross * lastCross < 0) { 118 | return false; 119 | } 120 | lastCross = cross; 121 | } 122 | } 123 | return true; 124 | } 125 | GetCenterCoord() { 126 | let center = new GJKTutorial.Vec2(); 127 | let sumWeight = 0; 128 | for (let i = 0; i < this.vertices.length; ++i) { 129 | let point = this.vertices[i]; 130 | let point_prev = this.vertices[(i - 1 + this.vertices.length) % this.vertices.length]; 131 | let point_next = this.vertices[(i + 1) % this.vertices.length]; 132 | let weight = point.coord.Sub(point_prev.coord).magnitude + point.coord.Sub(point_next.coord).magnitude; 133 | center = center.Add(point.coord.Mul(weight)); 134 | sumWeight += weight; 135 | } 136 | return center.Div(sumWeight); 137 | } 138 | Support(dir) { 139 | let maxDot = Number.MIN_SAFE_INTEGER; 140 | let supportVertex = null; 141 | for (let i = 0; i < this.vertices.length; ++i) { 142 | let candidiateVertex = this.vertices[i]; 143 | let dot = candidiateVertex.coord.Dot(dir); 144 | if (dot > maxDot) { 145 | maxDot = dot; 146 | supportVertex = candidiateVertex; 147 | } 148 | } 149 | return supportVertex; 150 | } 151 | Draw(deltaMs, coord, context, strokeColor, fillColor) { 152 | if (this.vertices.length <= 0) { 153 | return; 154 | } 155 | context.beginPath(); 156 | context.lineWidth = 0.8; 157 | context.strokeStyle = strokeColor; 158 | let beginPos = coord.GetCanvasPosByCoord(this.vertices[0].coord); 159 | context.moveTo(beginPos.x, beginPos.y); 160 | for (let i = 1; i <= this.vertices.length; ++i) { 161 | let pos = coord.GetCanvasPosByCoord(this.vertices[i % this.vertices.length].coord); 162 | context.lineTo(pos.x, pos.y); 163 | } 164 | context.stroke(); 165 | context.closePath(); 166 | context.fillStyle = this.fillColor; 167 | context.fill(); 168 | for (let i = 0; i < this.vertices.length; ++i) { 169 | this.vertices[i].Draw(deltaMs, coord, context); 170 | } 171 | if (this.drawName && this.name) { 172 | let pos = coord.GetCanvasPosByCoord(this.GetCenterCoord()); 173 | context.fillStyle = 'black'; 174 | context.font = "40px Arial"; 175 | context.fillText(this.name, pos.x, pos.y); 176 | } 177 | } 178 | } 179 | GJKTutorial.Polygon = Polygon; 180 | })(GJKTutorial || (GJKTutorial = {})); 181 | //# sourceMappingURL=Polygon.js.map -------------------------------------------------------------------------------- /build/Polygon.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Polygon.js","sourceRoot":"","sources":["../TsSource/Polygon.ts"],"names":[],"mappings":"AAAA,IAAO,WAAW,CAgPjB;AAhPD,WAAO,WAAW;IAEd,MAAa,OAAQ,SAAQ,YAAA,MAAM;QAAnC;;YAEY,aAAQ,GAAc,EAAE,CAAC;QA2OrC,CAAC;QAxOU,SAAS,CAAC,MAAe;YAE5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QAEM,YAAY,CAAC,KAAc;YAE9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC;QAEM,WAAW,CAAC,QAAgC;YAE/C,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QAClC,CAAC;QAEM,WAAW;YAEd,OAAO,IAAI,CAAC,QAAQ,CAAC;QACzB,CAAC;QAEM,SAAS,CAAC,MAAa;YAE1B,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAC5C;gBACI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;aAC/D;QACL,CAAC;QAED,mEAAmE;QAC5D,OAAO;YAEV,IAAI,WAAW,GAAY,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,cAAc,GAAY,EAAE,CAAC;YACjC,IAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EACzB;gBACI,OAAO;aACV;YAED,IAAI,gBAAgB,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;YACnC,IAAI,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;YACnC,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,EAC1C;gBACI,IAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI;uBACzB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,EAExE;oBACI,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC9B,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC9B,gBAAgB,GAAG,CAAC,CAAC;iBACxB;aACJ;YACD,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,IAAI,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,KAAK,GAAG,IAAI,YAAA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,EAAE;gBACrB,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC1C,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAE1C,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;gBAChC,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;gBAEhC,IAAG,UAAU,IAAI,CAAC,EAClB;oBACI,OAAO,CAAC,CAAC,CAAC;iBACb;qBAAK,IAAG,UAAU,IAAI,CAAC,EACxB;oBACI,OAAO,CAAC,CAAC;iBACZ;gBAED,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxB,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBAExB,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAE3B,IAAG,IAAI,IAAI,IAAI,EACf;oBACI,OAAO,IAAI,GAAG,IAAI,CAAC;iBACtB;gBAED,IAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,EACnC;oBACI,OAAO,UAAU,GAAG,UAAU,CAAA;iBACjC;qBAAI;oBACD,OAAO,UAAU,GAAG,UAAU,CAAC;iBAClC;gBAED,OAAO,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;QACnC,CAAC;QAEM,OAAO;YAEV,IAAI,CAAC,QAAQ,GAAG,YAAA,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC;QAEM,QAAQ;YAEX,IAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAC3B;gBACI,OAAO,KAAK,CAAC;aAChB;YACD,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAC5C;gBACI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACtF,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAE/D,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAChD,IAAI,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAEhD,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEnC,IAAG,SAAS,IAAI,CAAC,EACjB;oBACI,SAAS,GAAG,KAAK,CAAC;iBACrB;qBAAK,IAAG,KAAK,IAAI,CAAC,EAAC;oBAChB,IAAG,KAAK,GAAG,SAAS,GAAG,CAAC,EACxB;wBACI,OAAO,KAAK,CAAC;qBAChB;oBACD,SAAS,GAAG,KAAK,CAAC;iBACrB;aAEJ;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;QAEM,eAAe,CAAC,KAAY;YAE/B,IAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAC3B;gBACI,OAAO,KAAK,CAAC;aAChB;YACD,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAC5C;gBACI,IAAI,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACrC,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAE/D,IAAI,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACxD,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAE7C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEnC,IAAG,SAAS,IAAI,CAAC,EACjB;oBACI,SAAS,GAAG,KAAK,CAAC;iBACrB;qBAAK,IAAG,KAAK,IAAI,CAAC,EAAC;oBAChB,IAAG,KAAK,GAAG,SAAS,GAAG,CAAC,EACxB;wBACI,OAAO,KAAK,CAAC;qBAChB;oBACD,SAAS,GAAG,KAAK,CAAC;iBACrB;aAEJ;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;QAEM,cAAc;YAEjB,IAAI,MAAM,GAAU,IAAI,YAAA,IAAI,EAAE,CAAC;YAC/B,IAAI,SAAS,GAAY,CAAC,CAAC;YAC3B,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAC5C;gBACI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACtF,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAE/D,IAAI,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;gBACvG,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7C,SAAS,IAAI,MAAM,CAAC;aACvB;YACD,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QAEM,OAAO,CAAC,GAAU;YAErB,IAAI,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;YACrC,IAAI,aAAa,GAAY,IAAI,CAAC;YAClC,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAC5C;gBACI,IAAI,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1C,IAAG,GAAG,GAAG,MAAM,EACf;oBACI,MAAM,GAAG,GAAG,CAAC;oBACb,aAAa,GAAG,gBAAgB,CAAC;iBACpC;aACJ;YACD,OAAO,aAAa,CAAC;QACzB,CAAC;QAEM,IAAI,CAAC,OAAgB,EAAE,KAAkB,EAAE,OAAkC,EAAE,WAAoB,EAAE,SAAkB;YAE1H,IAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EAC5B;gBACI,OAAO;aACV;YACD,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;YACxB,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;YAClC,IAAI,QAAQ,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvC,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAC7C;gBACI,IAAI,GAAG,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;gBACnF,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;aAChC;YACD,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACnC,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAC5C;gBACI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;aAClD;YACD,IAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAC7B;gBACI,IAAI,GAAG,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;gBAC5B,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;aAC7C;QACL,CAAC;KACJ;IA7OY,mBAAO,UA6OnB,CAAA;AACL,CAAC,EAhPM,WAAW,KAAX,WAAW,QAgPjB"} -------------------------------------------------------------------------------- /build/Raycast.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Raycast { 4 | constructor(point, dir, length) { 5 | this._p = point.Clone(); 6 | this._dir = dir.Normalize(); 7 | this._t = length; 8 | } 9 | get Point() { 10 | return this._p; 11 | } 12 | set Point(newStartPoint) { 13 | this._p = newStartPoint.Clone(); 14 | } 15 | get Dir() { 16 | return this._dir; 17 | } 18 | set Dir(dir) { 19 | this._dir = dir.Normalize(); 20 | } 21 | get Length() { 22 | return this._t; 23 | } 24 | set Length(length) { 25 | this._t = length; 26 | } 27 | } 28 | GJKTutorial.Raycast = Raycast; 29 | })(GJKTutorial || (GJKTutorial = {})); 30 | //# sourceMappingURL=Raycast.js.map -------------------------------------------------------------------------------- /build/Raycast.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Raycast.js","sourceRoot":"","sources":["../TsSource/Raycast.ts"],"names":[],"mappings":"AAAA,IAAO,WAAW,CA6CjB;AA7CD,WAAO,WAAW;IAEd,MAAa,OAAO;QAMhB,YAAY,KAAY,EAAE,GAAU,EAAE,MAAa;YAE/C,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC;QACrB,CAAC;QAED,IAAW,KAAK;YAEZ,OAAO,IAAI,CAAC,EAAE,CAAC;QACnB,CAAC;QAED,IAAW,KAAK,CAAC,aAA8B;YAE3C,IAAI,CAAC,EAAE,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;QACpC,CAAC;QAED,IAAW,GAAG;YAEV,OAAO,IAAI,CAAC,IAAI,CAAC;QACrB,CAAC;QAED,IAAW,GAAG,CAAC,GAAoB;YAE/B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAChC,CAAC;QAED,IAAW,MAAM;YAEb,OAAO,IAAI,CAAC,EAAE,CAAC;QACnB,CAAC;QAED,IAAW,MAAM,CAAC,MAAe;YAE7B,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC;QACrB,CAAC;KACJ;IA1CY,mBAAO,UA0CnB,CAAA;AACL,CAAC,EA7CM,WAAW,KAAX,WAAW,QA6CjB"} -------------------------------------------------------------------------------- /build/ShowCase_AddConvex.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ShowCase_AddConvex.js","sourceRoot":"","sources":["../TsSource/ShowCase_AddConvex.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /build/ShowCase_EPA.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | function InitShowCase_DrawEPAStep(framework, canvas, epaStepBtn, epaUndoBtn, epaClearBtn, epaPushOutToggleBtn) { 4 | let stepStack = []; 5 | //Draw 6 | let drawEPACustom = function (deltaMs, coord, context) { 7 | if (stepStack.length == 0) { 8 | return; 9 | } 10 | let drawStep = stepStack[stepStack.length - 1]; 11 | context.lineWidth = 1; 12 | context.strokeStyle = '#cc112266'; 13 | context.fillStyle = '#cc112266'; 14 | //draw lines and try to fill 15 | let startPos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[0].coord); 16 | context.moveTo(startPos.x, startPos.y); 17 | context.beginPath(); 18 | for (let i = 0; i < drawStep.simplex.GetVertices().length; ++i) { 19 | let pos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[i].coord); 20 | context.lineTo(pos.x, pos.y); 21 | } 22 | context.stroke(); 23 | context.fill(); 24 | context.closePath(); 25 | //draw support dir 26 | let startCoord = new GJKTutorial.Vec2(0, 0); 27 | startPos = coord.GetCanvasPosByCoord(startCoord); 28 | let endPos = coord.GetCanvasPosByCoord(startCoord.Add(drawStep.supportDir)); 29 | let bestLength = canvas.width / 4; 30 | endPos = startPos.Add(endPos.Sub(startPos).Normalize().Mul(bestLength)); 31 | GJKTutorial.drawArrow(context, startPos, endPos, bestLength / 10, 4, 'red'); 32 | //check if epa is finished. 33 | let bFinished = (stepStack.length >= 2 && drawStep.isLastStep); 34 | if (bFinished) { 35 | let resolveResult = GJKTutorial.ResolveEPAStep(drawStep); 36 | GJKTutorial.drawArrow(context, coord.GetCanvasPosByCoord(resolveResult.penetrationPointOnConvexA), coord.GetCanvasPosByCoord(resolveResult.penetrationPointOnConvexB), 0, 2, 'blue'); 37 | } 38 | }; 39 | framework.AddCustomDrawFunctionAfterDrawConvex(drawEPACustom); 40 | epaClearBtn.onclick = (evt) => { 41 | stepStack = []; 42 | GJKTutorial.EnableDraggingConvexObj(); 43 | }; 44 | epaUndoBtn.onclick = (evt) => { 45 | if (stepStack.length > 1) { 46 | stepStack.pop(); 47 | } 48 | }; 49 | epaStepBtn.onclick = (evt) => { 50 | let convexAB = framework.GetConvexAB(); 51 | if (!convexAB) { 52 | return null; 53 | } 54 | let convexA = convexAB.A; 55 | let convexB = convexAB.B; 56 | let lastStepResult = stepStack.length > 0 ? stepStack[stepStack.length - 1] : null; 57 | let stepResult = null; 58 | if (!lastStepResult) { 59 | //It's the first step, use the gjk result simplex as the basic simplex. 60 | let simplexGJKResult = GJKTutorial.GJKTest(convexA, convexB); 61 | if (!simplexGJKResult) { 62 | return; 63 | } 64 | GJKTutorial.DisableDraggingConvexObj(); 65 | stepResult = new GJKTutorial.EPAStepResult(); 66 | stepResult.simplex = simplexGJKResult; 67 | //give a next suggested support dir 68 | stepResult.supportDir = GJKTutorial.EPAGetBestNextSupportDir(stepResult.simplex); 69 | } 70 | else { 71 | stepResult = GJKTutorial.EPAStep(convexA, convexB, lastStepResult); 72 | } 73 | stepStack.push(stepResult); 74 | }; 75 | let autoPushOutHandle = -1; 76 | let autoPushOutEnable = false; 77 | function epaPushOutUpdate(dtMs) { 78 | let convexAB = framework.GetConvexAB(); 79 | if (!convexAB) { 80 | return null; 81 | } 82 | let convexA = convexAB.A; 83 | let convexB = convexAB.B; 84 | let epaResult = GJKTutorial.EAPTest(convexA, convexB); 85 | if (!epaResult) { 86 | return; 87 | } 88 | let pushObj = convexB; 89 | let pushDir = epaResult.penetrationDepthAtoB; 90 | if (GJKTutorial.GetCurrentDraggingConvexObj() == convexB) { 91 | pushObj = convexA; 92 | pushDir = pushDir.Mul(-1); 93 | } 94 | let maxDistance = pushDir.magnitude; 95 | let distance = Math.min(10 / 1000 * dtMs, maxDistance); //move 10 unit coord per second 96 | pushDir = pushDir.Normalize(); 97 | pushObj.Translate(pushDir.Mul(distance)); 98 | } 99 | epaPushOutToggleBtn.onclick = (evt) => { 100 | if (!autoPushOutEnable) { 101 | autoPushOutEnable = true; 102 | let lastUpdateTimeMs = Date.now(); 103 | autoPushOutHandle = setInterval(() => { 104 | let currentTimeMs = Date.now(); 105 | let delta = currentTimeMs - lastUpdateTimeMs; 106 | epaPushOutUpdate(delta); 107 | lastUpdateTimeMs = currentTimeMs; 108 | }, 16); 109 | } 110 | else { 111 | clearInterval(autoPushOutHandle); 112 | autoPushOutEnable = false; 113 | } 114 | }; 115 | } 116 | GJKTutorial.InitShowCase_DrawEPAStep = InitShowCase_DrawEPAStep; 117 | })(GJKTutorial || (GJKTutorial = {})); 118 | //# sourceMappingURL=ShowCase_EPA.js.map -------------------------------------------------------------------------------- /build/ShowCase_EPA.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ShowCase_EPA.js","sourceRoot":"","sources":["../TsSource/ShowCase_EPA.ts"],"names":[],"mappings":"AAAA,IAAO,WAAW,CAmJjB;AAnJD,WAAO,WAAW;IAEd,SAAgB,wBAAwB,CAAC,SAAqB,EAAE,MAAwB,EAAE,UAAsB,EAAE,UAAsB,EAAE,WAAuB,EAAE,mBAA+B;QAE9L,IAAI,SAAS,GAAqB,EAAE,CAAC;QAErC,MAAM;QACN,IAAI,aAAa,GAAG,UAAS,OAAgB,EAAE,KAAkB,EAAE,OAAkC;YAEjG,IAAG,SAAS,CAAC,MAAM,IAAI,CAAC,EACxB;gBACI,OAAO;aACV;YACD,IAAI,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAE/C,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;YAClC,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC;YAEhC,4BAA4B;YAC5B,IAAI,QAAQ,GAAG,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAC7D;gBACI,IAAI,GAAG,GAAG,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC7E,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;aAChC;YACD,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,SAAS,EAAE,CAAC;YAGpB,kBAAkB;YAClB,IAAI,UAAU,GAAG,IAAI,YAAA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,QAAQ,GAAG,KAAK,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,MAAM,GAAG,KAAK,CAAC,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YAC5E,IAAI,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YAClC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACxE,YAAA,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAEhE,2BAA2B;YAC3B,IAAI,SAAS,GAAG,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC/D,IAAG,SAAS,EACZ;gBACI,IAAI,aAAa,GAAG,YAAA,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAE7C,YAAA,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,mBAAmB,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;aAC5K;QACL,CAAC,CAAA;QACD,SAAS,CAAC,oCAAoC,CAAC,aAAa,CAAC,CAAC;QAK9D,WAAW,CAAC,OAAO,GAAG,CAAC,GAAG,EAAC,EAAE;YACzB,SAAS,GAAG,EAAE,CAAC;YACf,YAAA,uBAAuB,EAAE,CAAC;QAC9B,CAAC,CAAC;QAEF,UAAU,CAAC,OAAO,GAAG,CAAC,GAAG,EAAC,EAAE;YACxB,IAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EACvB;gBACI,SAAS,CAAC,GAAG,EAAE,CAAC;aACnB;QACL,CAAC,CAAA;QAGD,UAAU,CAAC,OAAO,GAAG,CAAC,GAAG,EAAC,EAAE;YACxB,IAAI,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YACvC,IAAG,CAAC,QAAQ,EACZ;gBACI,OAAO,IAAI,CAAC;aACf;YACD,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;YACzB,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;YAEzB,IAAI,cAAc,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACnF,IAAI,UAAU,GAAmB,IAAI,CAAC;YACtC,IAAG,CAAC,cAAc,EAClB;gBACI,uEAAuE;gBACvE,IAAI,gBAAgB,GAAG,YAAA,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACjD,IAAG,CAAC,gBAAgB,EACpB;oBACI,OAAO;iBACV;gBACD,YAAA,wBAAwB,EAAE,CAAC;gBAC3B,UAAU,GAAG,IAAI,YAAA,aAAa,EAAE,CAAC;gBACjC,UAAU,CAAC,OAAO,GAAG,gBAAgB,CAAC;gBACtC,mCAAmC;gBACnC,UAAU,CAAC,UAAU,GAAG,YAAA,wBAAwB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aACxE;iBAAI;gBACD,UAAU,GAAG,YAAA,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;aAC1D;YAED,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,CAAA;QAED,IAAI,iBAAiB,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAE9B,SAAS,gBAAgB,CAAC,IAAa;YAEnC,IAAI,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YACvC,IAAG,CAAC,QAAQ,EACZ;gBACI,OAAO,IAAI,CAAC;aACf;YACD,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;YACzB,IAAI,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;YACzB,IAAI,SAAS,GAAG,YAAA,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,IAAG,CAAC,SAAS,EACb;gBACI,OAAO;aACV;YACD,IAAI,OAAO,GAAG,OAAO,CAAC;YACtB,IAAI,OAAO,GAAG,SAAS,CAAC,oBAAoB,CAAC;YAC7C,IAAG,YAAA,2BAA2B,EAAE,IAAI,OAAO,EAC3C;gBACI,OAAO,GAAG,OAAO,CAAC;gBAClB,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7B;YAED,IAAI,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAG,+BAA+B;YACzF,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,mBAAmB,CAAC,OAAO,GAAG,CAAC,GAAG,EAAC,EAAE;YACjC,IAAG,CAAC,iBAAiB,EACrB;gBACI,iBAAiB,GAAG,IAAI,CAAC;gBACzB,IAAI,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAClC,iBAAiB,GAAG,WAAW,CAAC,GAAE,EAAE;oBAChC,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC/B,IAAI,KAAK,GAAG,aAAa,GAAG,gBAAgB,CAAC;oBAC7C,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACxB,gBAAgB,GAAG,aAAa,CAAC;gBACrC,CAAC,EAAE,EAAE,CAAC,CAAC;aACV;iBAAI;gBACD,aAAa,CAAC,iBAAiB,CAAC,CAAC;gBACjC,iBAAiB,GAAG,KAAK,CAAC;aAC7B;QACL,CAAC,CAAA;IACL,CAAC;IAhJe,oCAAwB,2BAgJvC,CAAA;AACL,CAAC,EAnJM,WAAW,KAAX,WAAW,QAmJjB"} -------------------------------------------------------------------------------- /build/ShowCase_GJK.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | function InitShowCase_DrawGJKStep(framework, canvas, gjkStepBtn, gjkUndoBtn, gjkClearBtn) { 4 | let stepStack = []; 5 | let currentSupportDir = new GJKTutorial.Vec2(0, 0); 6 | let currentSupportDirStartCoord = new GJKTutorial.Vec2(0, 0); 7 | //Draw 8 | let drawGJKCustom = function (deltaMs, coord, context) { 9 | if (stepStack.length == 0) { 10 | return; 11 | } 12 | let drawStep = stepStack[stepStack.length - 1]; 13 | context.lineWidth = 1; 14 | context.strokeStyle = '#cc112266'; 15 | context.fillStyle = '#cc112266'; 16 | //draw vertices 17 | for (let i = 0; i < drawStep.simplex.GetVertices().length; ++i) { 18 | let pos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[i].coord); 19 | context.beginPath(); 20 | context.arc(pos.x, pos.y, 10, 0, 2 * Math.PI, false); 21 | context.fill(); 22 | context.closePath(); 23 | } 24 | //draw lines and try to fill 25 | let startPos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[0].coord); 26 | context.moveTo(startPos.x, startPos.y); 27 | context.beginPath(); 28 | for (let i = 0; i < drawStep.simplex.GetVertices().length; ++i) { 29 | let pos = coord.GetCanvasPosByCoord(drawStep.simplex.GetVertices()[i].coord); 30 | context.lineTo(pos.x, pos.y); 31 | } 32 | context.stroke(); 33 | if (drawStep.simplex.GetVertices().length > 2) { 34 | context.fill(); 35 | } 36 | context.closePath(); 37 | //draw support dir 38 | startPos = coord.GetCanvasPosByCoord(currentSupportDirStartCoord); 39 | let endPos = coord.GetCanvasPosByCoord(currentSupportDirStartCoord.Add(currentSupportDir)); 40 | let bestLength = canvas.width / 4; 41 | endPos = startPos.Add(endPos.Sub(startPos).Normalize().Mul(bestLength)); 42 | GJKTutorial.drawArrow(context, startPos, endPos, bestLength / 10, 4, 'red'); 43 | }; 44 | framework.AddCustomDrawFunctionAfterDrawConvex(drawGJKCustom); 45 | //Manually configure support dir 46 | let mouseDown = function (evt) { 47 | let pos = new GJKTutorial.Vec2(evt.offsetX, evt.offsetY); 48 | currentSupportDirStartCoord = framework.GetCoordinate().GetCoordByCanvasPos(pos); 49 | }; 50 | let mouseUp = function (evt) { 51 | let pos = new GJKTutorial.Vec2(evt.offsetX, evt.offsetY); 52 | let coord = framework.GetCoordinate().GetCoordByCanvasPos(pos); 53 | currentSupportDir = coord.Sub(currentSupportDirStartCoord); 54 | }; 55 | let mouseMove = function (evt) { 56 | let pos = new GJKTutorial.Vec2(evt.offsetX, evt.offsetY); 57 | let coord = framework.GetCoordinate().GetCoordByCanvasPos(pos); 58 | currentSupportDir = coord.Sub(currentSupportDirStartCoord); 59 | }; 60 | gjkClearBtn.onclick = (evt) => { 61 | stepStack = []; 62 | GJKTutorial.EnableDraggingConvexObj(); 63 | framework.UnRegisterLeftMouseEvent(mouseDown, mouseMove, mouseUp); 64 | }; 65 | gjkUndoBtn.onclick = (evt) => { 66 | if (stepStack.length > 1) { 67 | let undoStep = stepStack.pop(); 68 | if (undoStep) { 69 | currentSupportDir = undoStep.supportDir; 70 | currentSupportDirStartCoord = undoStep['supportDirStart']; 71 | if (!currentSupportDirStartCoord) { 72 | currentSupportDirStartCoord = new GJKTutorial.Vec2(0, 0); 73 | } 74 | } 75 | } 76 | }; 77 | gjkStepBtn.onclick = (evt) => { 78 | let convexAB = framework.GetConvexAB(); 79 | if (!convexAB) { 80 | return null; 81 | } 82 | let convexA = convexAB.A; 83 | let convexB = convexAB.B; 84 | let lastStepResult = stepStack.length > 0 ? stepStack[stepStack.length - 1] : null; 85 | if (!lastStepResult) { 86 | GJKTutorial.DisableDraggingConvexObj(); 87 | framework.RegisterLeftMouseEvent(mouseDown, mouseMove, mouseUp); 88 | //it's the first step, we specify the dir from convexB to convexA as the support dir 89 | currentSupportDir = convexA.GetCenterCoord().Sub(convexB.GetCenterCoord()); 90 | } 91 | let stepResult = GJKTutorial.GJKStep(convexA, convexB, currentSupportDir, lastStepResult); 92 | stepResult['supportDirStart'] = currentSupportDirStartCoord; 93 | stepStack.push(stepResult); 94 | //give a suggested support dir 95 | currentSupportDir = GJKTutorial.GJKGetBestNextSupportDir(stepResult.simplex); 96 | if (!currentSupportDir) { 97 | //after first step, there is only 1 vertex in simplex, so we must specify a support dir. 98 | currentSupportDir = convexB.GetCenterCoord().Sub(convexA.GetCenterCoord()); 99 | currentSupportDirStartCoord = convexA.GetCenterCoord(); 100 | } 101 | else { 102 | let nearestVertices = stepResult.simplex.GetClosestEdgeToOrigin(); 103 | currentSupportDirStartCoord = nearestVertices[0].coord.Add(nearestVertices[1].coord).Div(2); 104 | } 105 | }; 106 | } 107 | GJKTutorial.InitShowCase_DrawGJKStep = InitShowCase_DrawGJKStep; 108 | })(GJKTutorial || (GJKTutorial = {})); 109 | //# sourceMappingURL=ShowCase_GJK.js.map -------------------------------------------------------------------------------- /build/ShowCase_GJK.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ShowCase_GJK.js","sourceRoot":"","sources":["../TsSource/ShowCase_GJK.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /build/ShowCase_MinkowskiDiff.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | function GetFullMinkowskiDiffVertices(conv1, conv2) { 4 | let result = []; 5 | let poly1 = conv1; 6 | let poly2 = conv2; 7 | if (!(poly1 instanceof GJKTutorial.Polygon) || !(poly2 instanceof GJKTutorial.Polygon)) { 8 | window.alert("Only Polygon Objects can draw Full Minkowski Difference!"); 9 | return result; 10 | } 11 | for (let i = 0; i < poly1.GetVertices().length; ++i) { 12 | for (let j = 0; j < poly2.GetVertices().length; ++j) { 13 | let vertex = new GJKTutorial.Vertex(poly1.GetVertices()[i].coord.Sub(poly2.GetVertices()[j].coord), ""); 14 | let simplexVertex = new GJKTutorial.SimplexVertex(vertex, poly1.GetVertices()[i].coord, poly2.GetVertices()[j].coord); 15 | simplexVertex.drawName = false; 16 | simplexVertex.name = poly1.GetVertices()[i].name + "-" + poly2.GetVertices()[j].name; 17 | result.push(simplexVertex); 18 | } 19 | } 20 | return result; 21 | } 22 | function InitShowCase_MinkowskiDiff(framework, buttonShowMinkowskiDiff) { 23 | let drawEdgeNum = -1; 24 | let timeBeginMs = 0; 25 | let allVertices = []; 26 | let drawFullMinkowskiDiff = (deltaMs, coord, context) => { 27 | let convexAB = framework.GetConvexAB(); 28 | if (!convexAB || drawEdgeNum == -1) { 29 | return null; 30 | } 31 | let convexA = convexAB.A; 32 | let convexB = convexAB.B; 33 | allVertices = GetFullMinkowskiDiffVertices(convexA, convexB); 34 | if (allVertices.length < 3) { 35 | return; 36 | } 37 | let diffOutlineVertices = GJKTutorial.GetConvexFromVertices(allVertices); 38 | if (diffOutlineVertices.length < 3) { 39 | return; 40 | } 41 | if (drawEdgeNum > diffOutlineVertices.length + 1) { 42 | drawEdgeNum = -1; 43 | return; 44 | } 45 | let finishedDrawAllEdges = (drawEdgeNum > diffOutlineVertices.length); 46 | //Draw Candidiate Vertices When Show Animation 47 | if (!finishedDrawAllEdges) { 48 | for (let i = 0; i < allVertices.length; ++i) { 49 | let ve = allVertices[i]; 50 | let pos = coord.GetCanvasPosByCoord(ve.coord); 51 | context.lineWidth = 0; 52 | context.fillStyle = 'red'; 53 | context.moveTo(pos.x, pos.y); 54 | context.beginPath(); 55 | context.arc(pos.x, pos.y, 3, 0, 360, false); 56 | context.fill(); 57 | context.closePath(); 58 | context.fillText(allVertices[i].name + "", pos.x, pos.y); 59 | } 60 | } 61 | //Draw Edges 62 | let startPos = coord.GetCanvasPosByCoord(diffOutlineVertices[0].coord); 63 | context.moveTo(startPos.x, startPos.y); 64 | context.beginPath(); 65 | context.setLineDash([]); //solidLine 66 | context.strokeStyle = 'green'; 67 | context.lineWidth = finishedDrawAllEdges ? 0.5 : 2; 68 | for (let i = 0; i < Math.min(diffOutlineVertices.length + 1, drawEdgeNum); ++i) { 69 | let pos = coord.GetCanvasPosByCoord(diffOutlineVertices[i % diffOutlineVertices.length].coord); 70 | context.lineTo(pos.x, pos.y); 71 | } 72 | context.stroke(); 73 | if (finishedDrawAllEdges) { 74 | context.fillStyle = '#00FF2228'; 75 | context.fill(); 76 | } 77 | context.closePath(); 78 | //Animation 79 | if (!finishedDrawAllEdges && drawEdgeNum > 0) { 80 | let fromDir = new GJKTutorial.Vec2(0, 1); 81 | if (drawEdgeNum > 1) { 82 | fromDir = diffOutlineVertices[drawEdgeNum - 1].coord.Sub(diffOutlineVertices[drawEdgeNum - 2].coord); 83 | } 84 | let targetDir = diffOutlineVertices[drawEdgeNum % diffOutlineVertices.length].coord.Sub(diffOutlineVertices[drawEdgeNum - 1].coord); 85 | let currentDir = new GJKTutorial.Vec2(targetDir.x, targetDir.y); 86 | let targetDegree = fromDir.GetDegreeToCW(targetDir); 87 | let startPosAnim = coord.GetCanvasPosByCoord(diffOutlineVertices[drawEdgeNum - 1].coord); 88 | context.moveTo(startPosAnim.x, startPosAnim.y); 89 | context.beginPath(); 90 | let currentDegree = (Date.now() - timeBeginMs) * 0.1; 91 | context.setLineDash([]); 92 | if (currentDegree < targetDegree) { 93 | currentDir = fromDir.RotateCW(currentDegree); 94 | context.strokeStyle = 'red'; 95 | context.lineWidth = 3; 96 | context.setLineDash([3, 3]); 97 | } 98 | else { 99 | context.strokeStyle = 'green'; 100 | context.lineWidth = 2; 101 | } 102 | currentDir = currentDir.Normalize().Mul(coord.coordXMax); 103 | let targetPos = coord.GetCanvasPosByCoord(diffOutlineVertices[drawEdgeNum - 1].coord.Add(currentDir)); 104 | context.lineTo(startPosAnim.x, startPosAnim.y); 105 | context.lineTo(targetPos.x, targetPos.y); 106 | context.stroke(); 107 | context.setLineDash([]); 108 | context.closePath(); 109 | } 110 | //name of Vertices 111 | if (finishedDrawAllEdges) { 112 | diffOutlineVertices.forEach((vertex) => { 113 | let pos = coord.GetCanvasPosByCoord(vertex.coord); 114 | context.fillStyle = 'green'; 115 | context.font = "20px Arial"; 116 | context.fillText(vertex.name + "(" + GJKTutorial.numToString(vertex.coord.x, 2) + "," + GJKTutorial.numToString(vertex.coord.y, 2) + ")", pos.x, pos.y); 117 | }); 118 | } 119 | }; 120 | framework.AddCustomDrawFunctionBeforeDrawConvex(drawFullMinkowskiDiff); 121 | buttonShowMinkowskiDiff.onclick = (evt) => { 122 | ++drawEdgeNum; 123 | timeBeginMs = Date.now(); 124 | }; 125 | } 126 | GJKTutorial.InitShowCase_MinkowskiDiff = InitShowCase_MinkowskiDiff; 127 | })(GJKTutorial || (GJKTutorial = {})); 128 | //# sourceMappingURL=ShowCase_MinkowskiDiff.js.map -------------------------------------------------------------------------------- /build/ShowCase_MinkowskiDiff.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ShowCase_MinkowskiDiff.js","sourceRoot":"","sources":["../TsSource/ShowCase_MinkowskiDiff.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /build/ShowCase_Paint.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ShowCase_Paint.js","sourceRoot":"","sources":["../TsSource/ShowCase_Paint.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /build/Simplex.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Simplex extends GJKTutorial.Polygon { 4 | IncludeOrigin() { 5 | return this.IsPointInConvex(new GJKTutorial.Vec2(0, 0)); 6 | } 7 | AddVertex(vertex) { 8 | super.AddVertex(vertex); 9 | } 10 | SetVertices(vertices) { 11 | super.SetVertices(vertices); 12 | } 13 | GetVertices() { 14 | return super.GetVertices(); 15 | } 16 | //return null if vertices count is less than 2. 17 | GetClosestEdgeToOrigin() { 18 | if (this.GetVertices().length < 2) { 19 | return null; 20 | } 21 | else if (this.GetVertices().length == 2) { 22 | return this.GetVertices(); 23 | } 24 | let closestDistanceSqr = Number.MAX_SAFE_INTEGER; 25 | let resultVertices = [null, null]; 26 | let origin = new GJKTutorial.Vec2(0, 0); 27 | for (let i = 0; i < this.GetVertices().length; ++i) { 28 | let p0 = this.GetVertices()[i]; 29 | let p1 = this.GetVertices()[(i + 1) % this.GetVertices().length]; 30 | let distanceSqr = GJKTutorial.PointDistanceToSegmentSqr(origin, p0.coord, p1.coord); 31 | if (distanceSqr < closestDistanceSqr) { 32 | closestDistanceSqr = distanceSqr; 33 | resultVertices[0] = p0; 34 | resultVertices[1] = p1; 35 | } 36 | } 37 | return resultVertices; 38 | } 39 | } 40 | GJKTutorial.Simplex = Simplex; 41 | })(GJKTutorial || (GJKTutorial = {})); 42 | //# sourceMappingURL=Simplex.js.map -------------------------------------------------------------------------------- /build/Simplex.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Simplex.js","sourceRoot":"","sources":["../TsSource/Simplex.ts"],"names":[],"mappings":"AAAA,IAAO,WAAW,CAqDjB;AArDD,WAAO,WAAW;IAEd,MAAa,OAAQ,SAAQ,YAAA,OAAO;QAEzB,aAAa;YAEhB,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,YAAA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QAEM,SAAS,CAAC,MAAsB;YAEnC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAEM,WAAW,CAAC,QAAuC;YAEtD,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAEM,WAAW;YAEd,OAAO,KAAK,CAAC,WAAW,EAAkC,CAAC;QAC/D,CAAC;QAED,+CAA+C;QACxC,sBAAsB;YAEzB,IAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,EAChC;gBACI,OAAO,IAAI,CAAC;aACf;iBAAK,IAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,EACvC;gBACI,OAAO,IAAI,CAAC,WAAW,EAAkC,CAAC;aAC7D;YACD,IAAI,kBAAkB,GAAG,MAAM,CAAC,gBAAgB,CAAC;YACjD,IAAI,cAAc,GAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpD,IAAI,MAAM,GAAkB,IAAI,YAAA,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EACjD;gBACI,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAkB,CAAC;gBAChD,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAkB,CAAC;gBAElF,IAAI,WAAW,GAAG,YAAA,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBACxE,IAAG,WAAW,GAAG,kBAAkB,EACnC;oBACI,kBAAkB,GAAG,WAAW,CAAC;oBACjC,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBACvB,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;iBAC1B;aACJ;YACD,OAAO,cAAc,CAAC;QAC1B,CAAC;KACJ;IAlDY,mBAAO,UAkDnB,CAAA;AACL,CAAC,EArDM,WAAW,KAAX,WAAW,QAqDjB"} -------------------------------------------------------------------------------- /build/SimplexVertex.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | //This type of vertex is used for Simplex 4 | class SimplexVertex extends GJKTutorial.Vertex { 5 | constructor(diffVertex, convexACoord, convexBCoord) { 6 | super(diffVertex.coord, diffVertex.name); 7 | this.m_convexACoord = convexACoord.Clone(); 8 | this.m_convexBCoord = convexBCoord.Clone(); 9 | } 10 | GetConvexCoordA() { 11 | return this.m_convexACoord; 12 | } 13 | GetConvexCoordB() { 14 | return this.m_convexBCoord; 15 | } 16 | } 17 | GJKTutorial.SimplexVertex = SimplexVertex; 18 | })(GJKTutorial || (GJKTutorial = {})); 19 | //# sourceMappingURL=SimplexVertex.js.map -------------------------------------------------------------------------------- /build/SimplexVertex.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"SimplexVertex.js","sourceRoot":"","sources":["../TsSource/SimplexVertex.ts"],"names":[],"mappings":"AAAA,IAAO,WAAW,CAyBjB;AAzBD,WAAO,WAAW;IAEd,yCAAyC;IACzC,MAAa,aAAc,SAAQ,YAAA,MAAM;QAKrC,YAAY,UAAmB,EAAE,YAAmB,EAAE,YAAmB;YAErE,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC;QAC/C,CAAC;QAEM,eAAe;YAElB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC/B,CAAC;QAEM,eAAe;YAElB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC/B,CAAC;KACJ;IArBY,yBAAa,gBAqBzB,CAAA;AACL,CAAC,EAzBM,WAAW,KAAX,WAAW,QAyBjB"} -------------------------------------------------------------------------------- /build/Utils.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | function numToString(num, accuracy) { 4 | let mul = Math.pow(10, accuracy); 5 | num = num * mul; 6 | num = Math.round(num); 7 | num = num / mul; 8 | return num + ""; 9 | } 10 | GJKTutorial.numToString = numToString; 11 | //custom alphabet decode 12 | function DecodeCustomCharCode(code, isSmallCase) { 13 | let startAsciiCode = isSmallCase ? 97 : 65; //97 is ascii code of letter 'a' while 65 is that of letter 'A'; 14 | let name = ''; 15 | do { 16 | let tail = code % 26; 17 | name = String.fromCharCode(startAsciiCode + tail) + name; 18 | code = (code - tail) / 26; 19 | } while (code > 0); 20 | return name; 21 | } 22 | GJKTutorial.DecodeCustomCharCode = DecodeCustomCharCode; 23 | //custom alphabet encode 24 | function EncodeCustomCharCode(text) { 25 | let result = 0; 26 | for (let i = 0; i < text.length; ++i) { 27 | let char = text.charCodeAt(i); 28 | if (char >= 65 && char <= 90) //upperCase 29 | { 30 | char -= 65; 31 | } 32 | else if (char >= 97 && char <= 122) { 33 | char -= 97; //lowerCase 34 | } 35 | result += char * Math.pow(26, text.length - 1 - i); 36 | } 37 | return result; 38 | } 39 | GJKTutorial.EncodeCustomCharCode = EncodeCustomCharCode; 40 | //try to make a convex as small as possible to surround all the input vertices 41 | //the return value is in cw order, may be some inner vertices will be discarded. 42 | function GetConvexFromVertices(vertices) { 43 | let result = []; 44 | let startVertexIndex = -1; 45 | for (let i = 0; i < vertices.length; ++i) { 46 | let vertex = vertices[i]; 47 | if (startVertexIndex < 0) { 48 | startVertexIndex = i; 49 | } 50 | else if (vertex.coord.x < vertices[startVertexIndex].coord.x) { 51 | startVertexIndex = i; 52 | } 53 | else if (vertex.coord.x == vertices[startVertexIndex].coord.x && vertex.coord.y > vertices[startVertexIndex].coord.y) { 54 | startVertexIndex = i; 55 | } 56 | } 57 | let startVertex = vertices[startVertexIndex]; 58 | result.push(startVertex); 59 | while (true) { 60 | let fromDir = new GJKTutorial.Vec2(0, 1); //up direction 61 | for (let i = result.length - 1; i > 0; --i) { 62 | let dir = result[i].coord.Sub(result[i - 1].coord); 63 | if (dir.magnitudeSqr != 0) { 64 | fromDir = dir; 65 | break; 66 | } 67 | } 68 | let currentStartCoord = result[result.length - 1].coord; 69 | let nextVertexIndex = -1; 70 | let nextVertexDegree = Number.MAX_SAFE_INTEGER; 71 | for (let i = 0; i < vertices.length; ++i) { 72 | let candidiateCoord = vertices[i].coord; 73 | let candidiateDir = candidiateCoord.Sub(currentStartCoord); 74 | if (Math.abs(candidiateDir.x) < Number.EPSILON && Math.abs(candidiateDir.y) < Number.EPSILON) { 75 | //ignore overlapping vertex 76 | continue; 77 | } 78 | let candidiateDegreeCw = fromDir.GetDegreeToCW(candidiateDir); 79 | if (candidiateDegreeCw < nextVertexDegree) { 80 | nextVertexIndex = i; 81 | nextVertexDegree = candidiateDegreeCw; 82 | } 83 | } 84 | let nextVertex = vertices[nextVertexIndex]; 85 | if (nextVertex == startVertex) { 86 | break; 87 | } 88 | result.push(nextVertex); 89 | } 90 | return result; 91 | } 92 | GJKTutorial.GetConvexFromVertices = GetConvexFromVertices; 93 | function PointDistanceToSegmentSqr(point, segmentP0, segmentP1) { 94 | let l2 = segmentP0.Sub(segmentP1).magnitudeSqr; 95 | if (l2 === 0) { 96 | return segmentP0.Sub(point).magnitudeSqr; 97 | } 98 | let t = ((point.x - segmentP0.x) * (segmentP1.x - segmentP0.x) + (point.y - segmentP0.y) * (segmentP1.y - segmentP0.y)) / l2; 99 | t = Math.max(0, Math.min(1, t)); 100 | return new GJKTutorial.Vec2(segmentP0.x + t * (segmentP1.x - segmentP0.x), segmentP0.y + t * (segmentP1.y - segmentP0.y)).Sub(point).magnitudeSqr; 101 | } 102 | GJKTutorial.PointDistanceToSegmentSqr = PointDistanceToSegmentSqr; 103 | function PointDistanceToSegment(point, segmentP0, segmentP1) { 104 | return Math.sqrt(PointDistanceToSegmentSqr(point, segmentP0, segmentP1)); 105 | } 106 | GJKTutorial.PointDistanceToSegment = PointDistanceToSegment; 107 | function ClosestPointOnSegment(point, segmentP0, segmentP1) { 108 | let dot0 = segmentP1.Sub(segmentP0).Dot(point.Sub(segmentP0)); 109 | if (dot0 <= 0) { 110 | return segmentP0.Clone(); 111 | } 112 | let dot1 = segmentP0.Sub(segmentP1).Dot(point.Sub(segmentP1)); 113 | if (dot1 <= 0) { 114 | return segmentP1.Clone(); 115 | } 116 | let dir = segmentP1.Sub(segmentP0); 117 | let lengthSqr = dir.magnitudeSqr; 118 | let result = segmentP0.Add(dir.Mul(dot0 / lengthSqr)); 119 | return result; 120 | } 121 | GJKTutorial.ClosestPointOnSegment = ClosestPointOnSegment; 122 | function Lerp01(point0, point1, lerpValue) { 123 | let diff = point1.Sub(point0); 124 | let magSqr = diff.magnitudeSqr; 125 | if (Math.abs(magSqr) < Number.EPSILON) { 126 | return point0.Clone(); 127 | } 128 | let mag = Math.sqrt(magSqr); 129 | let normalize = diff.Div(mag); 130 | return point0.Add(normalize.Mul(mag * lerpValue)); 131 | } 132 | GJKTutorial.Lerp01 = Lerp01; 133 | //draw a directional arrow 134 | function drawArrow(context, startPos, endPos, arrowLength, width, color) { 135 | context.lineWidth = width; 136 | context.strokeStyle = color; 137 | context.moveTo(startPos.x, startPos.y); 138 | context.beginPath(); 139 | context.lineTo(startPos.x, startPos.y); 140 | context.lineTo(endPos.x, endPos.y); 141 | let dir = endPos.Sub(startPos).Normalize().Mul(arrowLength); 142 | let leftDir = dir.RotateCW(240); 143 | let rightDir = dir.RotateCW(120); 144 | let leftArrowPoint = endPos.Add(leftDir); 145 | context.lineTo(leftArrowPoint.x, leftArrowPoint.y); 146 | let rightArrowPoint = endPos.Add(rightDir); 147 | context.lineTo(rightArrowPoint.x, rightArrowPoint.y); 148 | context.lineTo(endPos.x, endPos.y); 149 | context.stroke(); 150 | context.closePath(); 151 | } 152 | GJKTutorial.drawArrow = drawArrow; 153 | })(GJKTutorial || (GJKTutorial = {})); 154 | //# sourceMappingURL=Utils.js.map -------------------------------------------------------------------------------- /build/Utils.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Utils.js","sourceRoot":"","sources":["../TsSource/Utils.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /build/Vertex.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Vertex { 4 | constructor(inCoord, inName) { 5 | this.drawName = true; //toggle for name display; 6 | this.coord = inCoord.Clone(); 7 | this.name = inName; 8 | } 9 | get name() { 10 | return this._name; 11 | } 12 | set name(inName) { 13 | this._name = inName ? inName.toLowerCase() : inName; 14 | } 15 | Draw(deltaMs, coord, context) { 16 | if (!this.drawName) { 17 | return; 18 | } 19 | let pos = coord.GetCanvasPosByCoord(this.coord); 20 | context.font = "30px Arial"; 21 | context.fillStyle = "#000000FF"; 22 | context.fillText(this.name + "(" + GJKTutorial.numToString(this.coord.x, 2) + "," + GJKTutorial.numToString(this.coord.y, 2) + ")", pos.x, pos.y); 23 | } 24 | } 25 | GJKTutorial.Vertex = Vertex; 26 | })(GJKTutorial || (GJKTutorial = {})); 27 | //# sourceMappingURL=Vertex.js.map -------------------------------------------------------------------------------- /build/Vertex.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Vertex.js","sourceRoot":"","sources":["../TsSource/Vertex.ts"],"names":[],"mappings":"AAAA,IAAO,WAAW,CAqCjB;AArCD,WAAO,WAAW;IAEd,MAAa,MAAM;QAiBf,YAAY,OAAc,EAAE,MAAe;YAdpC,aAAQ,GAAa,IAAI,CAAC,CAAE,0BAA0B;YAgBzD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACvB,CAAC;QAdD,IAAW,IAAI;YAEX,OAAO,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,IAAW,IAAI,CAAC,MAAe;YAE3B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACxD,CAAC;QAQM,IAAI,CAAC,OAAgB,EAAE,KAAkB,EAAE,OAAkC;YAEhF,IAAG,CAAC,IAAI,CAAC,QAAQ,EACjB;gBACI,OAAO;aACV;YACD,IAAI,GAAG,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;YAC5B,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC;YAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,YAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,YAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9H,CAAC;KACJ;IAlCY,kBAAM,SAkClB,CAAA;AACL,CAAC,EArCM,WAAW,KAAX,WAAW,QAqCjB"} -------------------------------------------------------------------------------- /build/main.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | let draggingConvexObj = null; 4 | let draggingConvexObjDisableCounter = 0; 5 | function GetCurrentDraggingConvexObj() { 6 | return draggingConvexObj; 7 | } 8 | GJKTutorial.GetCurrentDraggingConvexObj = GetCurrentDraggingConvexObj; 9 | function DisableDraggingConvexObj() { 10 | ++draggingConvexObjDisableCounter; 11 | } 12 | GJKTutorial.DisableDraggingConvexObj = DisableDraggingConvexObj; 13 | function EnableDraggingConvexObj() { 14 | --draggingConvexObjDisableCounter; 15 | } 16 | GJKTutorial.EnableDraggingConvexObj = EnableDraggingConvexObj; 17 | window.onload = function () { 18 | let canvas = document.getElementById('canvas'); 19 | let framework = new GJKTutorial.Framework(canvas); 20 | /////////////////////Default Convex Objects//////////////////// 21 | let conv = new GJKTutorial.Polygon(); 22 | conv.AddVertex(new GJKTutorial.Vertex(new GJKTutorial.Vec2(6, 8), "a")); 23 | conv.AddVertex(new GJKTutorial.Vertex(new GJKTutorial.Vec2(5, 2), "b")); 24 | conv.AddVertex(new GJKTutorial.Vertex(new GJKTutorial.Vec2(1, 6), "c")); 25 | conv.name = "A"; 26 | framework.AddConvex(conv); 27 | conv = new GJKTutorial.Polygon(); 28 | conv.AddVertex(new GJKTutorial.Vertex(new GJKTutorial.Vec2(6, 4), "d")); 29 | conv.AddVertex(new GJKTutorial.Vertex(new GJKTutorial.Vec2(2, 2), "e")); 30 | conv.AddVertex(new GJKTutorial.Vertex(new GJKTutorial.Vec2(5, -2), "f")); 31 | conv.name = "B"; 32 | framework.AddConvex(conv); 33 | /////////////////////Default Convex Objects//////////////////// 34 | /////////////////////Custom Convex Functions//////////////////// 35 | let addTypeSelector = document.getElementById('ConvexType'); 36 | let buttonClear = document.getElementById('ClearAllConvex'); 37 | let buttonBeginAdd = document.getElementById('BeginAddNewConvex'); 38 | let buttonFinishAdd = document.getElementById('FinishAddNewConvex'); 39 | let buttonCancel = document.getElementById('CancelAddNewConvex'); 40 | GJKTutorial.InitShowCase_DrawCustomConvex(framework, canvas, buttonClear, buttonBeginAdd, buttonFinishAdd, buttonCancel, addTypeSelector); 41 | /////////////////////Custom Convex Functions//////////////////// 42 | /////////////////////Full Minkowski Difference Preview//////////////////// 43 | let buttonToggleMinkowskiDiff = document.getElementById("MinkowskiDiffToggle"); 44 | GJKTutorial.InitShowCase_MinkowskiDiff(framework, buttonToggleMinkowskiDiff); 45 | /////////////////////Full Minkowski Difference Preview//////////////////// 46 | //////////////////////GJK Step Demonstration//////////////////////////// 47 | let buttonGJKStep = document.getElementById("GJKStep"); 48 | let buttonGJKUndo = document.getElementById("GJKUndoStep"); 49 | let buttonGJKClear = document.getElementById("GJKClear"); 50 | GJKTutorial.InitShowCase_DrawGJKStep(framework, canvas, buttonGJKStep, buttonGJKUndo, buttonGJKClear); 51 | //////////////////////GJK Step Demonstration//////////////////////////// 52 | //////////////////////EPA Demonstration//////////////////////////// 53 | let buttonEPAStep = document.getElementById("EPAStep"); 54 | let buttonEPAUndo = document.getElementById("EPAUndoStep"); 55 | let buttonEPAClear = document.getElementById("EPAClear"); 56 | let buttonEPAPushOutToggle = document.getElementById("EPAPushOutToggle"); 57 | GJKTutorial.InitShowCase_DrawEPAStep(framework, canvas, buttonEPAStep, buttonEPAUndo, buttonEPAClear, buttonEPAPushOutToggle); 58 | //////////////////////GJK Step Demonstration//////////////////////////// 59 | /////////////////////GJK Raycast Demonstration/////////////////////// 60 | let buttonGJKRaycastStep = document.getElementById("GJKRaycastStep"); 61 | let buttonGJKRaycastUndo = document.getElementById("GJKRaycastUndoStep"); 62 | let buttonGJKRaycastClear = document.getElementById("GJKRaycastClear"); 63 | let buttonGJKRaycastRuntime = document.getElementById("GJKRaycastRuntime"); 64 | GJKTutorial.InitShowCase_DrawGJKRaycastStep(framework, canvas, buttonGJKRaycastStep, buttonGJKRaycastUndo, buttonGJKRaycastClear, buttonGJKRaycastRuntime); 65 | /////////////////////GJK Raycast Demonstration/////////////////////// 66 | /////////////////////////Drag Convex/////////////////////////////////// 67 | { 68 | let bDrag = false; 69 | let lastCood = null; 70 | canvas.addEventListener('mousedown', (evt) => { 71 | if (evt.button != 1) { 72 | return; 73 | } 74 | event.preventDefault(); 75 | bDrag = true; 76 | let pos = new GJKTutorial.Vec2(evt.offsetX, evt.offsetY); 77 | lastCood = framework.GetCoordinate().GetCoordByCanvasPos(pos); 78 | for (let i = 0; i < framework.GetConvexObjsCount(); ++i) { 79 | let candidiateConvex = framework.GetConvex(i); 80 | if (candidiateConvex.IsPointInConvex(lastCood)) { 81 | draggingConvexObj = candidiateConvex; 82 | break; 83 | } 84 | } 85 | }); 86 | canvas.addEventListener('mousemove', (evt) => { 87 | if (!bDrag || !draggingConvexObj || draggingConvexObjDisableCounter > 0) { 88 | return; 89 | } 90 | let pos = new GJKTutorial.Vec2(evt.offsetX, evt.offsetY); 91 | let coord = framework.GetCoordinate().GetCoordByCanvasPos(pos); 92 | draggingConvexObj.Translate(coord.Sub(lastCood)); 93 | lastCood = coord; 94 | }); 95 | canvas.addEventListener('mouseup', (evt) => { 96 | if (evt.button != 1) { 97 | return; 98 | } 99 | event.preventDefault(); 100 | bDrag = false; 101 | draggingConvexObj = null; 102 | }); 103 | } 104 | ////////////////////////////////////////////////////////////////////// 105 | /////////////////////Paint Tools/////////////////////// 106 | GJKTutorial.InitShowCase_Paint(framework, canvas, document.getElementById("strokeColors"), document.getElementById("fillColors"), document.getElementById("lineThick"), document.getElementById("lineMedium"), document.getElementById("lineThin"), document.getElementById("SolidLine"), document.getElementById("DashLine"), document.getElementById("disablePaint"), document.getElementById("drawLine"), document.getElementById("drawCircle"), document.getElementById("drawRectangle"), document.getElementById("drawArrow"), document.getElementById("undoPaint"), document.getElementById("clearPaint")); 107 | /////////////////////Paint Tools/////////////////////// 108 | }; 109 | })(GJKTutorial || (GJKTutorial = {})); 110 | //# sourceMappingURL=main.js.map -------------------------------------------------------------------------------- /build/main.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"main.js","sourceRoot":"","sources":["../TsSource/main.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /build/test.js: -------------------------------------------------------------------------------- 1 | class Vec3 { 2 | Sub(rhs) { 3 | return rhs; 4 | } 5 | Add(rhs) { 6 | return rhs; 7 | } 8 | Mul(rhs) { 9 | return this; 10 | } 11 | } 12 | Vec3.Zero = new Vec3(); 13 | class OBB { 14 | TransToLocal(point) { 15 | return point; 16 | } 17 | TransToGlobal(point) { 18 | return point; 19 | } 20 | } 21 | class AABB { 22 | constructor(ext) { 23 | this.extend = ext; 24 | } 25 | } 26 | function RaycastOBB(obb, startPoint, dir, distance) { 27 | return { collided: true, hitPoint: null, normal: null, distance: 0 }; 28 | } 29 | function MoveAloneDir(dir, normal) { 30 | return dir; 31 | } 32 | function Move(startPoint, dir, distance, collision) { 33 | let currentPos = startPoint; 34 | let currentDir = dir; 35 | let maxIterate = 3; 36 | let leftDistance = distance; 37 | while (leftDistance > 0 && maxIterate-- >= 0) { 38 | let raycastResult = RaycastOBB(collision, startPoint, dir, leftDistance); 39 | if (!raycastResult.collided) { 40 | return currentPos.Add(currentDir.Mul(leftDistance)); 41 | } 42 | currentPos = raycastResult.hitPoint; 43 | leftDistance -= raycastResult.distance; 44 | currentDir = MoveAloneDir(currentDir, raycastResult.normal); 45 | } 46 | return currentPos; 47 | } 48 | //# sourceMappingURL=test.js.map -------------------------------------------------------------------------------- /build/test.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"test.js","sourceRoot":"","sources":["../TsSource/test.ts"],"names":[],"mappings":"AAGI,MAAM,IAAI;IAQC,GAAG,CAAC,GAAU;QAEjB,OAAO,GAAG,CAAC;IACf,CAAC;IACM,GAAG,CAAC,GAAU;QAEjB,OAAO,GAAG,CAAC;IACf,CAAC;IACM,GAAG,CAAC,GAAY;QAEnB,OAAO,IAAI,CAAC;IAChB,CAAC;;AAbM,SAAI,GAAU,IAAI,IAAI,EAAE,CAAC;AAgBpC,MAAM,GAAG;IAIE,YAAY,CAAC,KAAY;QAE5B,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,aAAa,CAAC,KAAY;QAE7B,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AAED,MAAM,IAAI;IAIN,YAAY,GAAU;QAElB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IACtB,CAAC;CACJ;AAED,SAAS,UAAU,CAAC,GAAS,EAAE,UAAiB,EAAE,GAAU,EAAE,QAAiB;IAE3E,OAAO,EAAC,QAAQ,EAAG,IAAI,EAAE,QAAQ,EAAG,IAAI,EAAE,MAAM,EAAG,IAAI,EAAE,QAAQ,EAAG,CAAC,EAAC,CAAA;AAC1E,CAAC;AAED,SAAS,YAAY,CAAC,GAAU,EAAE,MAAa;IAE3C,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,IAAI,CAAC,UAAiB,EAAE,GAAU,EAAE,QAAiB,EAAE,SAAe;IAE3E,IAAI,UAAU,GAAG,UAAU,CAAC;IAC5B,IAAI,UAAU,GAAG,GAAG,CAAC;IACrB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,QAAQ,CAAC;IAC5B,OAAM,YAAY,GAAG,CAAC,IAAI,UAAU,EAAE,IAAI,CAAC,EAC3C;QACI,IAAI,aAAa,GAAG,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QACzE,IAAG,CAAC,aAAa,CAAC,QAAQ,EAC1B;YACI,OAAO,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;SACvD;QACD,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC;QACpC,YAAY,IAAI,aAAa,CAAC,QAAQ,CAAC;QACvC,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;KAC/D;IACD,OAAO,UAAU,CAAC;AACtB,CAAC"} -------------------------------------------------------------------------------- /build/vec2.js: -------------------------------------------------------------------------------- 1 | var GJKTutorial; 2 | (function (GJKTutorial) { 3 | class Vec2 { 4 | constructor(_x = 0, _y = 0) { 5 | this.x = 0; 6 | this.y = 0; 7 | this.x = _x; 8 | this.y = _y; 9 | } 10 | get magnitude() { 11 | return Math.sqrt(this.x * this.x + this.y * this.y); 12 | } 13 | get magnitudeSqr() { 14 | return this.x * this.x + this.y * this.y; 15 | } 16 | Add(rhs) { 17 | return new Vec2(this.x + rhs.x, this.y + rhs.y); 18 | } 19 | Sub(rhs) { 20 | return new Vec2(this.x - rhs.x, this.y - rhs.y); 21 | } 22 | Mul(mul) { 23 | return new Vec2(this.x * mul, this.y * mul); 24 | } 25 | Div(mul) { 26 | return new Vec2(this.x / mul, this.y / mul); 27 | } 28 | Dot(rhs) { 29 | return this.x * rhs.x + this.y * rhs.y; 30 | } 31 | Cross(rhs) { 32 | return this.x * rhs.y - this.y * rhs.x; 33 | } 34 | Equals(rhs) { 35 | return (Math.abs(this.x - rhs.x) < Number.EPSILON) && (Math.abs(this.y - rhs.y) < Number.EPSILON); 36 | } 37 | Clone() { 38 | return new Vec2(this.x, this.y); 39 | } 40 | RotateCW(degree) { 41 | let radian = degree / 180 * Math.PI; 42 | let sin = Math.sin(-radian); 43 | let cos = Math.cos(-radian); 44 | return new Vec2(this.x * cos - this.y * sin, this.x * sin + this.y * cos); 45 | } 46 | /// 0 - 360 47 | GetDegreeToCW(toVec) { 48 | let thisMag = this.magnitude; 49 | let toMag = toVec.magnitude; 50 | if (thisMag == 0 || toMag == 0) { 51 | return 0; 52 | } 53 | let cosine = this.Dot(toVec) / (thisMag * toMag); 54 | let radian = Math.acos(cosine); 55 | if (this.Cross(toVec) > 0) { 56 | radian = 2 * Math.PI - radian; 57 | } 58 | return radian * 360 / (2 * Math.PI); 59 | } 60 | toString() { 61 | return "{" + this.x + "," + this.y + "}"; 62 | } 63 | Normalize() { 64 | let magnitude = this.magnitude; 65 | if (magnitude == 0) { 66 | return new Vec2(); 67 | } 68 | return this.Div(magnitude); 69 | } 70 | } 71 | GJKTutorial.Vec2 = Vec2; 72 | })(GJKTutorial || (GJKTutorial = {})); 73 | //# sourceMappingURL=vec2.js.map -------------------------------------------------------------------------------- /build/vec2.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"vec2.js","sourceRoot":"","sources":["../TsSource/vec2.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Canvas demo 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 | 32 | 33 |
34 | 35 |
36 | 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 |

Paint

75 |
76 | stroke color 77 | 78 | 79 | 80 | 81 | 82 |
83 |
84 | fill color 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 |

How to add Convex:

123 |
124 | Click "BeginAddConvex" button, add click your left mouse button to add vertices of the new convex object. You can also click right mouse button to remove the last vertex you've added. 125 |
126 |
127 | Click "CancelAddNewConvex" button to cancel current "Adding Convex Object" action, all the vertices you've just added for this convex object will be removed. 128 |
129 |
130 | Click "FinishAddConvex" button will add the convex object to the coordinate and you can use it to test the collision detecting. 131 |
132 |
133 |
134 | 135 | 136 | --------------------------------------------------------------------------------