Skip to content

Instantly share code, notes, and snippets.

@nanjizal
Created July 9, 2024 18:59
Show Gist options
  • Save nanjizal/574ec51fc7d5b0eb3149358223fdffb0 to your computer and use it in GitHub Desktop.
Save nanjizal/574ec51fc7d5b0eb3149358223fdffb0 to your computer and use it in GitHub Desktop.
Mitre support
public inline
function mitreDraw( ax_: Float, ay_: Float, bx_: Float, by_: Float, width_: Float, clockWise: Bool ){
// bx_, by_ currently not required... but incase.
// work out the opposite point to j, ie the mitre corner.
// calculate the difference from centre
var deltaX = ax_ - jx;
var deltaY = ay_ - jy;
// reflect j in relation to a
var mitreCornerX = ax_ + deltaX;
var mitreCornerY = ay_ + deltaY;
// calculate distance between mitreCorner and centre a.
var distXY = Math.sqrt(deltaX*deltaX + deltaY*deltaY);
// calculate the miter cut off distance.
var mitreVal = mitreLimit*width_/2;
// see if it is applicable
var mitreLimited = distXY > mitreVal;
// find the ratio for extending the lines to the mitre cut off.
var mitreRatio = mitreVal/distXY;
if( clockWise ){
if( !mitreLimited ) { // simple case no mitre cropped
triangle2DFill( dxOld, dyOld, mitreCornerX, mitreCornerY, exPrev, eyPrev );
} else {
var deltaX1 = dxOld + mitreRatio*( mitreCornerX - dxOld );
var deltaY1 = dyOld + mitreRatio*( mitreCornerY - dyOld );
var deltaX2 = exPrev + mitreRatio*( mitreCornerX - exPrev );
var deltaY2 = eyPrev + mitreRatio*( mitreCornerY - eyPrev );
trace( 'delta ' + deltaX1 + ' ' + deltaX2 + ' ' + deltaY1 + ' ' + deltaY2 );
// split mitre cropped into two triangle from the first line to the crop
triangle2DFill( dxOld, dyOld, deltaX1, deltaY1, deltaX2, deltaY2 );
// from the first line to second crop point and then to second line
triangle2DFill( dxOld, dyOld, deltaX2, deltaY2, exPrev, eyPrev );
}
// draw normal triangle corner
triangle2DFill( dxOld, dyOld, exPrev, eyPrev, jx, jy );
} else {
if( !mitreLimited ) { // see notes above
triangle2DFill( exOld, eyOld, mitreCornerX, mitreCornerY, dxPrev, dyPrev );
} else {
var deltaX1 = exOld + mitreRatio*( mitreCornerX - exOld );
var deltaY1 = eyOld + mitreRatio*( mitreCornerY - eyOld );
var deltaX2 = dxPrev + mitreRatio*( mitreCornerX - dxPrev );
var deltaY2 = dyPrev + mitreRatio*( mitreCornerY - dyPrev );
trace( 'delta ' + deltaX1 + ' ' + deltaX2 + ' ' + deltaY1 + ' ' + deltaY2 );
triangle2DFill( exOld, eyOld, deltaX1, deltaY1, deltaX2, deltaY2 );
triangle2DFill( exOld, eyOld, deltaX2, deltaY2, dxPrev, dyPrev );
}
triangle2DFill( exOld, eyOld, dxPrev, dyPrev, jx, jy );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment