再画三角形

上一节利用线性规划的知识画了三角形。
这次依然需要画三角形
在这里插入图片描述

picture 1
根据上一节的结论可以发现,同样建立坐标系,可以得到的边界方程为

f ( x ) = { x + y − 6 = 0 x − y + 4 = 0 f(x)=\left\{ \begin{aligned} x +y-6 = 0 \\ x-y+4 = 0 \\ \end{aligned} \right. f(x)={x+y6=0xy+4=0

对应的区域为
f ( x ) = { x + y − 6 > = 0 x − y + 4 > = 0 f(x)=\left\{ \begin{aligned} x +y-6 >= 0 \\ x-y+4 >= 0 \\ \end{aligned} \right. f(x)={x+y6>=0xy+4>=0

但在程序中打印出来的结果却是下图picture 2
在这里插入图片描述

picture 2

对比picture 1和picture 2,我们可以看出
picture 2中的点明显比picture 1中多,即picture 2中的点比picture 1中的点要多。

对比发现现在的约束条件太弱了。需要剔除一些点(剔除也是一种思路)。但考虑到原来的点可以形成一条直线,我们换一种思路来考虑该问题–原来的点在一个直线族上面。
该直线族的方程可以写成:
对应的区域为
f ( x ) = { x + y − 6 = 0 x + y − 8 = 0 x + y − 10 = 0 . . . x + y − 2 ∗ K = 0 f(x)=\left\{ \begin{aligned} x +y-6 = 0 \\ x+y-8= 0 \\ x+y-10=0\\ ...\\ x+y-2*K=0 \end{aligned} \right. f(x)=x+y6=0x+y8=0x+y10=0...x+y2K=0

通过对直线族的观察可以看成是
f ( x ) = { x + y − 2 ∗ k = 0 、 k = 3 , 4 , 5 , . . . , n f(x)=\left\{ \begin{aligned} x+y-2*k=0 、k=3,4,5,...,n \end{aligned} \right. f(x)={x+y2k=0k=3,4,5,...,n
对于该问题可以看成是一系列直线的并集
需要不断的使用k=3,4,5,…,n的直线就并集。
但这样会增加工作量,需要使用很多方程做判断
考虑到直线集间的距离是相等的,我们使用
f ( x ) = { ( x + y − 6 ) m o d 2 = 0 f(x)=\left\{ \begin{aligned} (x+y-6)mod 2=0 \end{aligned} \right. f(x)={(x+y6)mod2=0
即可以判断,然后结合下式即可
f ( x ) = { x + y − 6 > = 0 x − y + 4 > = 0 f(x)=\left\{ \begin{aligned} x +y-6 >= 0 \\ x-y+4 >= 0 \\ \end{aligned} \right. f(x)={x+y6>=0xy+4>=0
故总体的判断条件为:
f ( x ) = { x + y − 6 > = 0 x − y + 4 > = 0 ( x + y − 6 ) m o d 2 = 0 f(x)=\left\{ \begin{aligned} x +y-6 >= 0 \\ x-y+4 >= 0 \\ (x+y-6)mod 2=0 \end{aligned} \right. f(x)=x+y6>=0xy+4>=0(x+y6)mod2=0

伪代码
for i= 1:7:
	for j=1:15:
		if i+j-6>=0 and x-y+4 >= 0 and (x+y-6)%2==0:
			print('*')
		else:
			print(' ')

对应的代码如下:

在这里插入代码片
for i in range(1,n+1):
        for j in range(1,2*n+1):
            if i+j-(n+1) >= 0 and (i+j-(n+1)) % 2 ==0 and i-j+(n-1) >= 0:
                print('*',end ='')
            else:
                print(' ',end = '')
        print('\t')

为了进一步扩大程序的使用范围与能力,主要是考虑到程序画不同大小的等腰三角形与代码的重复利用,可以移植性
将其封装为一个简单函数:

在这里插入代码片

def tritangle():
    m = input('输入参数')
    n = int(m)
    for i in range(1,n+1):
        for j in range(1,2*n+1):

            if i+j-(n+1) >= 0 and (i+j-(n+1)) % 2 ==0 and i-j+(n-1) >= 0:
                print('*',end ='')
            else:
                print(' ',end = '')
        print('\t')
<think>好的,用户之前问了怎么用Java Swing圆,现在又问三角形。我需要先回顾一下之前是怎么回答的,保持结构一致。 首先,用户可能是在学习Swing绘图,所以需要分步骤说明,就像之前那样。基础原理部分要提到paintComponent方法和Graphics对象,因为这是绘图的通用方法。然后具体到三角形,可能需要用drawPolygon或者线的方法。 三角形的方法可能有几种,比如使用drawPolygon,或者用drawLine三条边,或者用GeneralPath。我需要比较这几种方法的优缺点,推荐最常用的方式,可能drawPolygon比较直接。 在实现步骤里,应该像之前那样分创建自定义面板类和主窗口。代码部分要正确,尤其是坐标点的计算,可能需要用户指定三个顶点的位置。例如,如果是等边三角形,如何计算顶点坐标?或者让用户自定义三个点。不过可能先给出一个示例,比如居中的三角形。 关键参数说明部分要解释drawPolygon的参数,比如xPoints, yPoints, nPoints。可能需要用数学公式说明顶点的位置,比如用坐标系中的点来表示。 优化建议可以包括动态调整位置、填充颜色、边框样式等,和之前的圆类似。另外,可能提到如何不同类型的三角形,比如等腰、直角等,但可能需要用户自己计算坐标。 需要注意用户可能对坐标系不熟悉,所以需要再次强调原点在左上角,y轴向下。在三角形时,坐标点的顺序可能影响形状,需要说明清楚。 还要检查代码是否正确,比如在paintComponent里调用super,使用Graphics2D开启抗锯齿,这些在之前的回答里有提到,应该保持一致。 可能用户需要完整的代码示例,所以最后要提供一个可运行的例子,包括main方法和JFrame的设置,和之前圆的例子结构相同。 需要确保用中文回答,结构清晰,分阶段说明,代码正确,LaTeX公式正确应用,比如顶点坐标用$(x,y)$表示,独立公式用$$...$$。 总结一下,回答的结构应该包括基础原理、实现步骤、关键参数说明、优化建议,和完整代码示例。需要保持和之前圆的回答类似,让用户容易比较和参考。</think>在Java Swing中绘制三角形的步骤如下,分阶段说明: --- ### 一、基础原理 1. **Swing绘图核心方法**:需重写`JPanel`的`paintComponent(Graphics g)`方法 2. **使用`Graphics`类方法**: - `drawPolygon(int[] xPoints, int[] yPoints, int nPoints)`:绘制多边形 - `fillPolygon(...)`:填充多边形 3. **坐标系**:原点$(0,0)$位于组件左上角,y轴向下 --- ### 二、实现步骤 #### 1. 创建自定义面板类(以等边三角形为例) ```java class TrianglePanel extends JPanel { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 必须首先调用 // 启用抗锯齿(可选) Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 计算三角形顶点坐标 int centerX = getWidth() / 2; int centerY = getHeight() / 2; int sideLength = 100; // 边长 // 计算等边三角形顶点坐标 int[] xPoints = { centerX, // 顶点 centerX - sideLength/2, // 左下点 centerX + sideLength/2 // 右下点 }; int[] yPoints = { centerY - (int)(sideLength * Math.sqrt(3)/3), // 顶点y坐标 centerY + (int)(sideLength * Math.sqrt(3)/6), // 底边点y坐标 centerY + (int)(sideLength * Math.sqrt(3)/6) }; // 绘制三角形 g2d.drawPolygon(xPoints, yPoints, 3); } } ``` #### 2. 创建主窗口(与圆示例相同) ```java public static void main(String[] args) { SwingUtilities.invokeLater(() -> { JFrame frame = new JFrame("绘制三角形"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 400); frame.add(new TrianglePanel()); frame.setVisible(true); }); } ``` --- ### 三、关键参数说明 1. **`drawPolygon`方法**: $$ drawPolygon(int[]\ xPoints,\ int[]\ yPoints,\ int\ nPoints) $$ - $xPoints$: 所有顶点的x坐标数组 - $yPoints$: 所有顶点的y坐标数组 - $nPoints$: 顶点总数(三角形为3) 2. **等边三角形坐标计算**(以中心点$(cx, cy)$为例): - 顶点坐标:$(cx,\ cy - \frac{\sqrt{3}}{3}L)$ - 左下点坐标:$(cx - \frac{L}{2},\ cy + \frac{\sqrt{3}}{6}L)$ - 右下点坐标:$(cx + \frac{L}{2},\ cy + \frac{\sqrt{3}}{6}L)$ - 其中$L$为边长 --- ### 四、优化与扩展 1. **动态调整**:在`paintComponent`中实时计算顶点坐标,支持窗口缩放 2. **填充颜色**:使用`g2d.setColor(Color.BLUE)`和`fillPolygon`方法 3. **自定义形状**:修改顶点数组可绘制任意三角形 4. **边框样式**:通过`g2d.setStroke(new BasicStroke(3))`调整线宽 --- ### 五、其他实现方式 #### 方法1:使用`drawLine`逐边绘制 ```java // 绘制三条线段 g2d.drawLine(x1, y1, x2, y2); g2d.drawLine(x2, y2, x3, y3); g2d.drawLine(x3, y3, x1, y1); ``` #### 方法2:使用`GeneralPath`(适合复杂图形) ```java GeneralPath path = new GeneralPath(); path.moveTo(x1, y1); // 起点 path.lineTo(x2, y2); // 第二点 path.lineTo(x3, y3); // 第三点 path.closePath(); // 闭合路径 g2d.draw(path); ``` --- ### 完整代码执行效果 窗口中心将显示一个等边三角形,调整窗口大小时三角形保持居中,边长固定为100像素。可通过修改`sideLength`变量或顶点坐标实现不同形态的三角形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值