javafx draw circle

Dibuja un semi anillo-JavaFX



draw circle (3)

Path.arcTo () el parámetro SweepAngle se refiere al grado de rotación, si sweepAngle es positivo, el arco es en el sentido de las agujas del reloj, si sweepAngle es negativo, el arco está en el sentido contrario a las agujas del reloj.

Este código se usa en mi entorno de producción, dibuja un anillo de semicírculo usando una imagen de mapa de bits, la ruta va en el sentido de las agujas del reloj en el radio exterior, y en sentido antihorario en el radio interior:

drawpercent = 0.85; //this draws a semi ring to 85% you can change it using your code. DegreesStart = -90; DegreesRotation = 180; radiusPathRectF = new android.graphics.RectF((float)CentreX - (float)Radius, (float)CentreY - (float)Radius, (float)CentreX + (float)Radius, (float)CentreY + (float)Radius); innerradiusPathRectF = new android.graphics.RectF((float)CentreX - (float)InnerRadius, (float)CentreY - (float)InnerRadius, (float)CentreX + (float)InnerRadius, (float)CentreY + (float)InnerRadius); Path p = new Path(); //TODO put this outside your draw() function, you should never have a "new" keyword inside a fast loop. degrees = (360 + (DegreesStart)) % 360; radians = (360 - degrees + 90) * Math.PI / 180.0; //radians = Math.toRadians(DegreesStart); int XstartOuter = (int)Math.round((Math.cos(radians) * Radius + CentreX)); int YstartOuter = (int)Math.round((Math.sin(-radians)* Radius + CentreY)); int XstartInner = (int)Math.round((Math.cos(radians) * InnerRadius + CentreX)); int YstartInner = (int)Math.round((Math.sin(-radians) * InnerRadius + CentreY)); degrees = (360 + (DegreesStart + drawpercent * DegreesRotation)) % 360; //radians = degrees * Math.PI / 180.0; radians = (360 - degrees + 90) * Math.PI / 180.0; //radians = Math.toRadians(DegreesStart + drawpercent * DegreesRotation); int XendOuter = (int)Math.round((Math.cos(radians) * Radius + CentreX)); int YendOuter = (int)Math.round((Math.sin(-radians) * Radius + CentreY)); int XendInner = (int)Math.round((Math.cos(radians) * InnerRadius + CentreX)); int YendInner = (int)Math.round((Math.sin(-radians) * InnerRadius + CentreY)); //draw a path outlining the semi-circle ring. p.moveTo(XstartInner, YstartInner); p.lineTo(XstartOuter, YstartOuter); p.arcTo(radiusPathRectF, (float)DegreesStart - (float)90, (float)drawpercent * (float)DegreesRotation); p.lineTo(XendInner, YendInner); p.arcTo(innerradiusPathRectF, (float)degrees - (float)90, -1 * (float)drawpercent * (float)DegreesRotation); p.close(); g.clipPath(p); g.drawBitmap(bitmapCircularBarImage, bitmapRect0, bitmapRectXY, paint);

Me gustaría saber cómo dibujar un semicírculo en JavaFX. Traté de usar Shape y QuadCurve pero no pude hacer un semicírculo perfecto.

Aquí hay una foto de lo que intento dibujar:


Sugerencias:

  • Si no necesita una ruta de trazado completa, puede usar un arco.
  • Si no necesita rellenar el arco y solo quiere rastrear la ruta de contorno del arco, establezca el relleno del arco en nulo.
  • Si desea que la ruta de contorno del arco sea gruesa, configure los parámetros de trazo en el arco.
  • Si necesita un arco grueso que también está delineado, entonces es mejor definir un arco completo como en la respuesta de Uluk.

Código de muestra:

import javafx.application.Application; import javafx.scene.*; import javafx.scene.paint.Color; import javafx.scene.shape.*; import javafx.stage.Stage; public class SemiCircleSample extends Application { @Override public void start(Stage stage) { Arc arc = new Arc(50, 50, 25, 25, 0, 180); arc.setType(ArcType.OPEN); arc.setStrokeWidth(10); arc.setStroke(Color.CORAL); arc.setStrokeType(StrokeType.INSIDE); arc.setFill(null); stage.setScene(new Scene(new Group(arc), 100, 80)); stage.show(); } public static void main(String[] args) { launch(args); } }


La imagen que vinculó es en realidad un semianillo. Puede obtenerlo en JavaFX dibujando 2 arcos anidados y algunas líneas. Pero mi forma preferida es usar el Path .

public class SemiDemo extends Application { @Override public void start(Stage primaryStage) { Group root = new Group(); root.getChildren().add(drawSemiRing(120, 120, 100, 50, Color.LIGHTGREEN, Color.DARKGREEN)); root.getChildren().add(drawSemiRing(350, 350, 200, 30, Color.LIGHTSKYBLUE, Color.DARKBLUE)); Scene scene = new Scene(root, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } private Path drawSemiRing(double centerX, double centerY, double radius, double innerRadius, Color bgColor, Color strkColor) { Path path = new Path(); path.setFill(bgColor); path.setStroke(strkColor); path.setFillRule(FillRule.EVEN_ODD); MoveTo moveTo = new MoveTo(); moveTo.setX(centerX + innerRadius); moveTo.setY(centerY); ArcTo arcToInner = new ArcTo(); arcToInner.setX(centerX - innerRadius); arcToInner.setY(centerY); arcToInner.setRadiusX(innerRadius); arcToInner.setRadiusY(innerRadius); MoveTo moveTo2 = new MoveTo(); moveTo2.setX(centerX + innerRadius); moveTo2.setY(centerY); HLineTo hLineToRightLeg = new HLineTo(); hLineToRightLeg.setX(centerX + radius); ArcTo arcTo = new ArcTo(); arcTo.setX(centerX - radius); arcTo.setY(centerY); arcTo.setRadiusX(radius); arcTo.setRadiusY(radius); HLineTo hLineToLeftLeg = new HLineTo(); hLineToLeftLeg.setX(centerX - innerRadius); path.getElements().add(moveTo); path.getElements().add(arcToInner); path.getElements().add(moveTo2); path.getElements().add(hLineToRightLeg); path.getElements().add(arcTo); path.getElements().add(hLineToLeftLeg); return path; } public static void main(String[] args) { launch(args); } }

Consulte Shape API of JavaFX para obtener más información sobre las formas utilizadas en el código.
Captura de pantalla: