UNPKG

@turbox3d/graphic-component-pixi

Version:

Graphic component library based on pixi

52 lines (41 loc) 1.72 kB
import { Mesh2D } from '@turbox3d/renderer-pixi'; import * as PIXI from 'pixi.js'; import { Vec2 } from '@turbox3d/shared'; import { drawText } from '../_utils/utils'; interface IXY { x: number; y: number; } interface IAngleDimensionProps { center: IXY; rotation?: number; scale?: Vec2; radius: number; startAngle: number; endAngle: number; anticlockwise: boolean; } /** * @description: 半径尺寸线 */ export default class AngleDimension extends Mesh2D<IAngleDimensionProps> { protected view = new PIXI.Graphics(); public draw() { const graphics = this.view; graphics.clear(); graphics.lineStyle(1, 0x131313); graphics.line.native = true; graphics.arc(this.props.center.x, this.props.center.y, this.props.radius, this.props.startAngle, this.props.endAngle, !this.props.anticlockwise); // calculate number text let k = -1; if (this.props.anticlockwise) k *= -1; if (this.props.endAngle % (Math.PI * 2) < this.props.startAngle % (Math.PI * 2)) k *= -1; let text = Math.abs(this.props.endAngle - this.props.startAngle) % (Math.PI * 2) * 180 / Math.PI; if (k < 0) text = 360 - text; const bisectorAngle = (this.props.startAngle + this.props.endAngle) / 2; const bisectorDir = { x: Math.cos(bisectorAngle), y: Math.sin(bisectorAngle) }; drawText(graphics, text.toFixed(0), { offset: { x: this.props.center.x + 1.3 * k * this.props.radius * bisectorDir.x, y: this.props.center.y + 1.2 * k * this.props.radius * bisectorDir.y }, size: this.props.radius / 2, rotation: Math.PI / 2 + bisectorAngle }); this.view.rotation = this.props.rotation ?? 0; this.view.scale.set(this.props.scale?.x ?? 1, this.props.scale?.y ?? 1); } }