Triangle.java

/**
 * 三角形图形实现类。
 * 
 * <p>表示一个由三个顶点定义的三角形图形,包含以下属性:
 * <ul>
 *   <li>(x1,y1): 第一个顶点坐标</li>
 *   <li>(x2,y2): 第二个顶点坐标</li>
 *   <li>(x3,y3): 第三个顶点坐标</li>
 * </ul>
 * 
 * <p>实现了Shape接口的所有方法:
 * <ul>
 *   <li>render(): 使用渲染器绘制三角形</li>
 *   <li>move(): 移动所有顶点</li>
 *   <li>accept(): 访问者模式支持</li>
 * </ul>
 *
 * <p>典型用法:
 * <pre>{@code
 * Triangle triangle = new Triangle(10,10, 50,10, 30,40);
 * triangle.render(renderer); // 绘制三角形
 * triangle.move(5,5); // 移动三角形
 * }</pre>
 *
 * @author DeepSeek-Coder
 * @version 1.0
 * @see Shape 图形接口
 * @since 2025-06-24
 */
package com.example.renderer.factory;

import com.example.renderer.bridge.Renderer;
import com.example.renderer.visitor.ExportVisitor;



/**
 * 三角形图形实现类
 */
public class Triangle implements Shape {
    private int x1, y1, x2, y2, x3, y3;

    /**
     * 无参构造器,用于序列化和反射创建实例。
     * 创建后需要通过setter方法设置顶点坐标。
     */
    /**
     * 无参构造器,用于序列化和反射创建实例。
     * 
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public Triangle() {}

    /**
     * 创建指定顶点坐标的三角形实例。
     * 
     * @param x1 第一个顶点x坐标
     * @param y1 第一个顶点y坐标
     * @param x2 第二个顶点x坐标
     * @param y2 第二个顶点y坐标
     * @param x3 第三个顶点x坐标
     * @param y3 第三个顶点y坐标
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public Triangle(int x1, int y1, int x2, int y2, int x3, int y3) {
        this.x1 = x1; this.y1 = y1;
        this.x2 = x2; this.y2 = y2;
        this.x3 = x3; this.y3 = y3;
    }

    /**
     * 使用指定渲染器绘制三角形。
     * 
     * @param renderer 用于绘制图形的渲染器实现(非null)
     * @throws NullPointerException 如果renderer参数为null
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    @Override
    public void render(Renderer renderer) {
        renderer.drawTriangle(x1, y1, x2, y2, x3, y3);
    }

    @Override
    public void accept(ExportVisitor visitor) {
        visitor.visitTriangle(this);
    }

    @Override
    public void move(int dx, int dy) {
        x1 += dx;
        y1 += dy;
        x2 += dx;
        y2 += dy;
        x3 += dx;
        y3 += dy;
    }

    /**
     * 获取第一个顶点的x坐标
     * @return 第一个顶点的x坐标值
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getX1() { return x1; }

    /**
     * 获取第一个顶点的y坐标
     * @return 第一个顶点的y坐标值
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getY1() { return y1; }

    /**
     * 获取第二个顶点的x坐标
     * @return 第二个顶点的x坐标值
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getX2() { return x2; }

    /**
     * 获取第二个顶点的y坐标
     * @return 第二个顶点的y坐标值
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getY2() { return y2; }

    /**
     * 获取第三个顶点的x坐标
     * @return 第三个顶点的x坐标值
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getX3() { return x3; }

    /**
     * 获取第三个顶点的y坐标
     * @return 第三个顶点的y坐标值
     * @author Aider+DeepSeek
     * @since 2025-06-24
     */
    public int getY3() { return y3; }

    @Override
    public Triangle clone() {
        try {
            return (Triangle) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}