gpt4 book ai didi

java - Java Swing 中的 DrawLine

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:44 24 4
gpt4 key购买 nike

主要思想是 - 当 slider 的值增加时,更多的线将组件的相同部分分开,并且不会与多边形的线交叉(就像图片的左上角一样)。我想对所有角都执行此操作,但现在我只对其中一个角执行此操作。

有人可以告诉我需要更改什么才能使线条宽度变为 1/3 吗?

我的值适合 1/2,但不适用于 1/3,n 是 slider 的变量。

enter image description here

我的代码:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Mariusz extends JFrame {

private int n = 5;
private Color kolor = Color.RED;

MyComponent komponent = null;

private class MyComponent extends JComponent
{
protected void paintComponent (Graphics grafika)
{
grafika.setColor(kolor);
grafika.drawLine(getWidth() * 1/3, 0, 0, getHeight() * 1/3);
grafika.drawLine(0, getHeight() * 1/3, getWidth() * 1/3, getHeight());
grafika.drawLine(getWidth() * 1/3, getHeight(),getWidth(), getHeight() * 1/3);
grafika.drawLine(getWidth(), getHeight() * 1/3, getWidth() * 1/3, 0);

for (int i = 0; i < n ; i++)
{
if (i <= n / 3)
{
grafika.drawLine(getWidth() * i /n, 0, getWidth() * i /n, (getHeight() - getHeight() * 2/3 ) - getHeight() * i / n); //lewy gorny
grafika.drawLine( getWidth() * i / n,(getHeight() - getHeight() * 2/3 ) + getHeight() * i / n + getHeight() *1/3, getWidth() * i / n, getHeight() );
}
if (i > n / 3)
{
grafika.drawLine(getWidth() * i / n , 0, getWidth() * i /n, getHeight() * 2 * i /n / 3 - getHeight() * 1 /3 );
}
}
}
}

public Mariusz(String string)
{
super(string);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension d = kit.getScreenSize();
setBounds( d.width / 4, d.height / 4, d.width / 2, d.height / 2);

add (komponent = new MyComponent());

JPanel panel = new JPanel(new BorderLayout());
add(panel,BorderLayout.SOUTH);

final JSlider slider = new JSlider(3,40,n);
slider.addChangeListener(new ChangeListener() {

@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
n = slider.getValue();
komponent.repaint();

}
});
panel.add(slider);

setVisible(true);
}

public static void main(String[] args)
{
// TODO Auto-generated method stub
EventQueue.invokeLater(new Runnable() {
public void run() {
new Mariusz("triangles");
}
});

}
}

最佳答案

您的方法是临时的,我不能认为它会在其他措施(4/5 等)中取得成功。

这是一种基于相似三角形的方法:

从右上角开始向后:

h1/h2=(2*w/3)/(2*w/3-(1/n)*(2*w/3))

因此

h2=h1/(.....)

其中 h1=h/3。

将其转换为代码

    double f=2./3, f2=1-f;

g2.setColor(Color.blue);

for (int i=n-1; i>-1; i--)
{
grafika.drawLine(getWidth() * (n-i) / n, 0, getWidth() * (n-i)/n,
(int)((getHeight()/ 3)/(f/(f-1.*i/n))) );
}

对于左上角,我们以相同的方式工作,但使用因子 f2:

g2.setColor(Color.green);

for (int i=0; i<n; i++)
{
grafika.drawLine(getWidth() * i / n , 0, getWidth() * i /n, (int)((getHeight()/ 3)/(f2/(f2-1.*i/n))) );
}

左下角相同:

g2.setColor(Color.magenta);

for (int i=0; i<n; i++)
{
grafika.drawLine(getWidth() * i / n , getHeight()-(int)((2*getHeight()/ 3)/(f2/(f2-1.*i/n))), getWidth() * i /n, getHeight() );
}

右下

g2.setColor(Color.black);

for (int i=n-1; i>-1; i--)
{
grafika.drawLine(getWidth() * (n-i) / n , getHeight()-(int)((2*getHeight()/ 3)/(f/(f-1.*i/n))), getWidth() * (n-i) /n, getHeight() );
}

例如,如果您想要 4/5 尺寸,则必须更改 f=4./5 以及所有 2*getHeight()/3 至 4*getHeight()/5(getHeight()/3 至 getHeight()/5 等)。

关于java - Java Swing 中的 DrawLine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41472070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com