📄 drawtriangle.as
字号:
_v1 = materialHeight * (1 - uv1._v); _v2 = materialHeight * (1 - uv2._v); // Fix perpendicular projections if ((_u0 == _u1 && _v0 == _v1) || (_u0 == _u2 && _v0 == _v2)) { if (_u0 > 0.05) _u0 -= 0.05; else _u0 += 0.05; if (_v0 > 0.07) _v0 -= 0.07; else _v0 += 0.07; } if (_u2 == _u1 && _v2 == _v1) { if (_u2 > 0.04) _u2 -= 0.04; else _u2 += 0.04; if (_v2 > 0.06) _v2 -= 0.06; else _v2 += 0.06; } if (material is BitmapMaterialContainer) { invtexturemapping = new Matrix(_u1 - _u0, _v1 - _v0, _u2 - _u0, _v2 - _v0, _u0 - face.bitmapRect.x, _v0 - face.bitmapRect.y); texturemapping = invtexturemapping.clone(); texturemapping.invert(); return texturemapping; } texturemapping = new Matrix(_u1 - _u0, _v1 - _v0, _u2 - _u0, _v2 - _v0, _u0, _v0); texturemapping.invert(); return texturemapping; } /** * @inheritDoc */ public override final function getZ(x:Number, y:Number):Number { if (projection == null) return screenZ; focus = projection.focus; ax = v0.x; ay = v0.y; az = v0.z; bx = v1.x; by = v1.y; bz = v1.z; cx = v2.x; cy = v2.y; cz = v2.z; if ((ax == x) && (ay == y)) return az; if ((bx == x) && (by == y)) return bz; if ((cx == x) && (cy == y)) return cz; azf = az / focus; bzf = bz / focus; czf = cz / focus; faz = 1 + azf; fbz = 1 + bzf; fcz = 1 + czf; axf = ax*faz - x*azf; bxf = bx*fbz - x*bzf; cxf = cx*fcz - x*czf; ayf = ay*faz - y*azf; byf = by*fbz - y*bzf; cyf = cy*fcz - y*czf; det = axf*(byf - cyf) + bxf*(cyf - ayf) + cxf*(ayf - byf); da = x*(byf - cyf) + bxf*(cyf - y) + cxf*(y - byf); db = axf*(y - cyf) + x*(cyf - ayf) + cxf*(ayf - y); dc = axf*(byf - y) + bxf*(y - ayf) + x*(ayf - byf); return (da*az + db*bz + dc*cz) / det; } /** * Calulates the uv value of a precise point on the drawing primitive. * Used to determine the mouse position in interactive materials. * * @param x The x position of the point to be tested. * @param y The y position of the point to be tested. * @return The uv value. */ public function getUV(x:Number, y:Number):UV { if (uv0 == null) return null; if (uv1 == null) return null; if (uv2 == null) return null; au = uv0._u; av = uv0._v; bu = uv1._u; bv = uv1._v; cu = uv2._u; cv = uv2._v; focus = projection.focus; ax = v0.x; ay = v0.y; az = v0.z; bx = v1.x; by = v1.y; bz = v1.z; cx = v2.x; cy = v2.y; cz = v2.z; if ((ax == x) && (ay == y)) return uv0; if ((bx == x) && (by == y)) return uv1; if ((cx == x) && (cy == y)) return uv2; azf = az / focus; bzf = bz / focus; czf = cz / focus; faz = 1 + azf; fbz = 1 + bzf; fcz = 1 + czf; axf = ax*faz - x*azf; bxf = bx*fbz - x*bzf; cxf = cx*fcz - x*czf; ayf = ay*faz - y*azf; byf = by*fbz - y*bzf; cyf = cy*fcz - y*czf; det = axf*(byf - cyf) + bxf*(cyf - ayf) + cxf*(ayf - byf); da = x*(byf - cyf) + bxf*(cyf - y) + cxf*(y- byf); db = axf*(y - cyf) + x*(cyf - ayf) + cxf*(ayf - y); dc = axf*(byf - y) + bxf*(y - ayf) + x*(ayf - byf); return new UV((da*au + db*bu + dc*cu) / det, (da*av + db*bv + dc*cv) / det); } /** * @inheritDoc */ public override final function quarter(focus:Number):Array { if (area < 20) return null; v01 = ScreenVertex.median(v0, v1, focus); v12 = ScreenVertex.median(v1, v2, focus); v20 = ScreenVertex.median(v2, v0, focus); uv01 = UV.median(uv0, uv1); uv12 = UV.median(uv1, uv2); uv20 = UV.median(uv2, uv0); return [ create(face, material, projection, v0, v01, v20, uv0, uv01, uv20), create(face, material, projection, v1, v12, v01, uv1, uv12, uv01), create(face, material, projection, v2, v20, v12, uv2, uv20, uv12), create(face, material, projection, v01, v12, v20, uv01, uv12, uv20) ]; } /** * @inheritDoc */ public override final function contains(x:Number, y:Number):Boolean { if (v0.x*(y - v1.y) + v1.x*(v0.y - y) + x*(v1.y - v0.y) < -0.001) return false; if (v0.x*(v2.y - y) + x*(v0.y - v2.y) + v2.x*(y - v0.y) < -0.001) return false; if (x*(v2.y - v1.y) + v1.x*(y - v2.y) + v2.x*(v1.y - y) < -0.001) return false; return true; } public final function distanceToCenter(x:Number, y:Number):Number { var centerx:Number = (v0.x + v1.x + v2.x) / 3, centery:Number = (v0.y + v1.y + v2.y) / 3; return Math.sqrt((centerx-x)*(centerx-x) + (centery-y)*(centery-y)); } /** * @inheritDoc */ public override function calc():void { if (v0.x > v1.x) { if (v0.x > v2.x) maxX = v0.x; else maxX = v2.x; } else { if (v1.x > v2.x) maxX = v1.x; else maxX = v2.x; } if (v0.x < v1.x) { if (v0.x < v2.x) minX = v0.x; else minX = v2.x; } else { if (v1.x < v2.x) minX = v1.x; else minX = v2.x; } if (v0.y > v1.y) { if (v0.y > v2.y) maxY = v0.y; else maxY = v2.y; } else { if (v1.y > v2.y) maxY = v1.y; else maxY = v2.y; } if (v0.y < v1.y) { if (v0.y < v2.y) minY = v0.y; else minY = v2.y; } else { if (v1.y < v2.y) minY = v1.y; else minY = v2.y; } if (v0.z > v1.z) { if (v0.z > v2.z) maxZ = v0.z; else maxZ = v2.z; } else { if (v1.z > v2.z) maxZ = v1.z; else maxZ = v2.z; } if (v0.z < v1.z) { if (v0.z < v2.z) minZ = v0.z; else minZ = v2.z; } else { if (v1.z < v2.z) minZ = v1.z; else minZ = v2.z; } screenZ = (v0.z + v1.z + v2.z) / 3; area = 0.5 * (v0.x*(v2.y - v1.y) + v1.x*(v0.y - v2.y) + v2.x*(v1.y - v0.y)); } /** * @inheritDoc */ public override function toString():String { var color:String = ""; if (material is WireColorMaterial) { switch ((material as WireColorMaterial).color) { case 0x00FF00: color = "green"; break; case 0xFFFF00: color = "yellow"; break; case 0xFF0000: color = "red"; break; case 0x0000FF: color = "blue"; break; } } return "T{"+color+int(area)+" screenZ = " + num(screenZ) + ", minZ = " + num(minZ) + ", maxZ = " + num(maxZ) + " }"; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -