使用Java图形绘制带线的圆
我有一个有趣的问题。使用Java graphics,我想画一个圆圈,圆圈中有平行线,这些线之间有一些预定义的间隙常数。该圆具有已知的x和y位置以及半径。直线应从圆的中心开始,并向外移动。比如说, 我认为最简单的方法是先画线,填充整个正方形,如下所示: 然后画4个多边形,用白色填充。4个多边形的标签如下所示: 如您所见,在这种情况下,多边形是由左顶点(x,y)、由圆半径定义的宽度和高度的边以及从(x+半径,y+半径)开始的圆弧定义的 需要反馈:使用Java图形绘制带线的圆,java,geometry,awt,java-2d,Java,Geometry,Awt,Java 2d,我有一个有趣的问题。使用Java graphics,我想画一个圆圈,圆圈中有平行线,这些线之间有一些预定义的间隙常数。该圆具有已知的x和y位置以及半径。直线应从圆的中心开始,并向外移动。比如说, 我认为最简单的方法是先画线,填充整个正方形,如下所示: 然后画4个多边形,用白色填充。4个多边形的标签如下所示: 如您所见,在这种情况下,多边形是由左顶点(x,y)、由圆半径定义的宽度和高度的边以及从(x+半径,y+半径)开始的圆弧定义的 需要反馈: 甚至可以在Java中绘制这样的多边形吗 这个逻
我会用三角法 直线的
x
由原点(圆心)角度的余弦给出。所以,arccos(x)
会给出角度
获得角度后,可以使用sinussin
功能获得其最大高度
当然,所有java trig函数都使用弧度(360度=2*PI弧度)。我会使用三角函数 直线的
x
由原点(圆心)角度的余弦给出。所以,arccos(x)
会给出角度
获得角度后,可以使用sinussin
功能获得其最大高度
当然,所有java trig函数都使用弧度(360度=2*PI弧度)。使用ol',下面是一段简单的代数。。。
r是圆的半径。x是一个变量,你可以通过知道半径和间距,以增量迭代圆 知道每条直线的高度(及其x位置),将垂直直线与圆环中心平行居中不会是一个挑战(如果您的放置坐标像通常那样指定左上角,您将希望将其放置在
y=circle\u center-(line\u length/2)
也请注意,如果你通过左上角指定垂直线的坐标,你需要考虑X坐标在计算X坐标时有多厚。
这非常简单,使用圆圈建议的x值。true\u x=建议的\u x-(线宽/2)
关于处理斜线,请参考其他更明智的答案
这个过程仍然是对使用剪辑寻找每条线的确切域/范围的敏感性的证明(因为我在上面浪费了太多的生命)
这就是我的乐趣结束的地方。
噢!用“tan(theta)”替换最后一个m,使用ol,下面这个简单的代数。。。
r是圆的半径。x是一个变量,你可以通过知道半径和间距,以增量迭代圆 知道每条直线的高度(及其x位置),将垂直直线与圆环中心平行居中不会是一个挑战(如果您的放置坐标像通常那样指定左上角,您将希望将其放置在
y=circle\u center-(line\u length/2)
也请注意,如果你通过左上角指定垂直线的坐标,你需要考虑X坐标在计算X坐标时有多厚。
这非常简单,使用圆圈建议的x值。true\u x=建议的\u x-(线宽/2)
关于处理斜线,请参考其他更明智的答案
这个过程仍然是对使用剪辑寻找每条线的确切域/范围的敏感性的证明(因为我在上面浪费了太多的生命)
这就是我的乐趣结束的地方。
哦!用“褐色(θ)”替换最后一个m只需更改图形剪辑
public class SimplePaint02 {
public static void main(String[] args) {
new SimplePaint02();
}
public SimplePaint02() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int radius = Math.min(getWidth(), getHeight());
int x = (getWidth() - radius) / 2;
int y = (getHeight()- radius) / 2;
BufferedImage buffer = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = buffer.createGraphics();
Ellipse2D circle = new Ellipse2D.Float(0, 0, radius, radius);
Shape clip = g2d.getClip();
g2d.setClip(circle);
int gap = getWidth() / 10;
g2d.setColor(Color.RED);
for (int index = 0; index < 10; index++) {
g2d.drawLine(index * gap, 0, index * gap, radius);
}
g2d.setClip(clip);
g2d.setColor(Color.BLUE);
g2d.draw(circle);
g2d.dispose();
g.drawImage(buffer, x, y, this);
}
}
}
简单更改图形剪辑
public class SimplePaint02 {
public static void main(String[] args) {
new SimplePaint02();
}
public SimplePaint02() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int radius = Math.min(getWidth(), getHeight());
int x = (getWidth() - radius) / 2;
int y = (getHeight()- radius) / 2;
BufferedImage buffer = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = buffer.createGraphics();
Ellipse2D circle = new Ellipse2D.Float(0, 0, radius, radius);
Shape clip = g2d.getClip();
g2d.setClip(circle);
int gap = getWidth() / 10;
g2d.setColor(Color.RED);
for (int index = 0; index < 10; index++) {
g2d.drawLine(index * gap, 0, index * gap, radius);
}
g2d.setClip(clip);
g2d.setColor(Color.BLUE);
g2d.draw(circle);
g2d.dispose();
g.drawImage(buffer, x, y, this);
}
}
}
我不认为多边形是可行的。相反,使用一点数学(三角学)要根据每条线距中心的半径确定每条线所需的高度,那么你的意思是,对于我知道的所有x点,使用圆的方程确定y位置?在绘制线时设置一个圆形剪辑。这将是另一个合理的解决方案。我不认为多边形是可行的方法。相反,使用一点数学(三角学)要根据每条线距中心的半径确定每条线所需的高度,那么你的意思是,对于我知道我的线落在的所有x点,使用圆的方程确定y位置?在绘制线时设置一个圆夹。这将是另一个合理的解决方案。抱歉,我没有遵循。你能澄清一下并写多一点吗细节。1)你说“你的线的x”…什么“线”?2)你说arccos(x)会给你。给我什么?什么角度?每条垂直线的所有点都具有相同的
x
(否则它们不会垂直)。与r的角度
public class CirlceDraw {
public static void main(String[] args) {
new CirlceDraw();
}
public CirlceDraw() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int radius = Math.min(getWidth(), getHeight());
int x = (getWidth() - radius) / 2;
int y = (getHeight() - radius) / 2;
BufferedImage buffer = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = buffer.createGraphics();
Ellipse2D circle = new Ellipse2D.Float(0, 0, radius, radius);
Shape clip = g2d.getClip();
g2d.setClip(circle);
AffineTransform at = g2d.getTransform();
g2d.setTransform(AffineTransform.getRotateInstance(Math.toRadians(33), radius / 2, radius / 2));
int gap = getWidth() / 10;
g2d.setColor(Color.RED);
for (int index = 0; index < 10; index++) {
g2d.drawLine(index * gap, 0, index * gap, radius);
}
g2d.setTransform(at);
g2d.setClip(clip);
g2d.setColor(Color.BLUE);
g2d.draw(circle);
g2d.dispose();
g.drawImage(buffer, x, y, this);
}
}
}