package main import ( "fmt" "math" ) /* 设计一个图形工作室的绘图与处理系统,具体要求如下: 1. 制定绘图标准,要求所有图形都能完成两项基础工作: - 生成绘制说明(返回字符串,描述绘制过程) - 计算占用面积(返回float64类型的面积数值) */ type Drawer interface { Draw() string Area() float64 } /* 2. 制定扩展处理标准,要求部分图形支持尺寸调整功能: - 按比例缩放(接收一个倍数参数,调整图形的大小) */ type Resizer interface { Scale(factor float64) } /* 3. 创建3种具体图形: - 圆形:包含半径属性 - 矩形:包含长和宽属性 - 三角形:包含底边长和高属性 */ type Circle struct { Radius float64 } type Rectangle struct { Width float64 Height float64 } type Triangle struct { Base float64 Height float64 } /* 4. 让所有图形都符合绘图标准: - 绘制说明要体现图形特征,如"绘制圆形(半径:10cm)" - 占用面积要根据各自图形的计算公式得出 */ // 圆形特征 func (c Circle) Draw() string { return fmt.Sprintf("绘制圆形(半径:%.2fcm)", c.Radius) } // 圆形面积 func (c Circle) Area() float64 { return math.Pi * c.Radius * c.Radius } // 矩形特征 func (r Rectangle) Draw() string { return fmt.Sprintf("绘制矩形(长:%.2fcm, 宽:%.2fcm)", r.Width, r.Height) } // 矩形面积 func (r Rectangle) Area() float64 { return r.Width * r.Height } // 三角形特征 func (t Triangle) Draw() string { return fmt.Sprintf("绘制三角形(底边:%.2fcm, 高:%.2fcm)", t.Base, t.Height) } // 三角形面积 func (t Triangle) Area() float64 { return 0.5 * t.Base * t.Height } /* 5. 让圆形和矩形额外符合扩展处理标准,实现尺寸调整功能(三角形暂不支持缩放) */ // 圆形缩放 func (c Circle) Scale(factor float64) { c.Radius *= factor } // 矩形缩放 func (r Rectangle) Scale(factor float64) { r.Width *= factor r.Height *= factor } // 三角形缩放(不支持) /* 6. 编写两个通用处理工具: - 图形信息统计工具:接收符合绘图标准的图形,输出其绘制说明和占用面积 - 尺寸调整工具:接收任意图形,检查其是否支持尺寸调整,如果支持则将其放大1.5倍,否则提示"该图形不支持尺寸调整" */ // 打印图形基础信息 func PrintInfo(d Drawer) { fmt.Println("基础信息:") fmt.Println("绘图说明:", d.Draw()) fmt.Printf("占用面积: %.2f cm²\n", d.Area()) } // 缩放 (不支持三角形) func Scale(d Drawer, factor float64) { fmt.Println("尺寸调整:") if resizer, ok := d.(Resizer); ok { resizer.Scale(factor) fmt.Printf("已放大 %.2f 倍\n", factor) } else { fmt.Println("该图形不支持尺寸调整") } } /* 7. 在系统主程序中创建各种图形实例,分别使用上述两个工具进行处理测试 要求:通过统一的标准对不同图形进行处理,展现相同操作在不同图形上的差异化表现,以及部分图形具有特殊处理能力的特性。 */ func main() { circle := Circle{Radius: 10} rectangle := Rectangle{Width: 10, Height: 20} triangle := Triangle{Base: 10, Height: 20} PrintInfo(circle) Scale(circle, 1.5) PrintInfo(rectangle) Scale(rectangle, 1.5) PrintInfo(triangle) Scale(triangle, 1.5) }