编写一个程序,接受一个字符串或文本文件,其第一行的格式为
width height
然后每行的格式为
x y intensity red green blue
哪里:
width
并且height
可以是任何正整数。x
并且y
可以是任何整数。intensity
可以是任何非负整数。red
,green
和blue
可以是0到255之间的任何整数(包括0和255)。
你的程序必须输出真彩在它的尺寸为任何常见的无损图像文件格式的图像width
通过height
。每条x y intensity red green blue
线代表必须在图像上绘制的彩色星星或球体。可能有任何数量的星形要绘制,包括0。您可以假定字符串或文件末尾有换行符。
绘制图像的算法如下,但是只要结果相同,您可以按照自己喜欢的任何方式实现它:
对于图像中的每个像素(X,Y)(其中X在最左边缘为0,在最右边缘为width-1,Y在顶部边缘为0,在底部边缘height-1),颜色通道C ϵ { 红色, 绿色,蓝色 }(固定在0到255之间的值)由以下公式给出:
其中dist函数为欧几里得距离:
或曼哈顿距离:
根据高尔夫球性或美观性,选择您喜欢的距离功能。
输入中除第一行外的每一行都是“ 星星”集的元素。因此,例如,S X表示
x
对输入线中的一个值,和S Ç表示任一red
,green
或blue
,这取决于当前正在计算色彩通道。
例子
例子A
如果输入是
400 150
-10 30 100 255 128 0
输出应该是
如果您使用的是欧几里德距离,并且
如果您使用的是曼哈顿距离。
例子B
如果输入是
200 200
100 100 10 255 255 255
20 20 40 255 0 0
180 20 40 255 255 0
180 180 40 0 255 0
20 180 40 0 0 255
欧几里得距离和曼哈顿距离的相应输出应为
和。
范例C
如果输入是
400 400
123 231 10 206 119 85
358 316 27 170 47 99
95 317 3 202 42 78
251 269 17 142 150 153
43 120 3 145 75 61
109 376 6 230 231 52
331 78 21 31 81 126
150 330 21 8 142 23
69 155 11 142 251 199
218 335 7 183 248 241
204 237 13 112 253 34
342 89 18 140 11 123
输出应该是
如果您使用的是欧几里德距离,并且
如果您使用的是曼哈顿距离。
例子D
如果输入是
400 400
123 231 5 206 119 85
358 316 5 170 47 99
95 317 5 202 42 78
251 269 5 142 150 153
43 120 5 145 75 61
109 376 5 230 231 52
331 78 5 31 81 126
150 330 5 8 142 23
69 155 5 142 251 199
218 335 5 183 248 241
204 237 5 112 253 34
342 89 5 140 11 123
输出应该是
如果您使用的是欧几里德距离,并且
如果您使用的是曼哈顿距离。
例E
如果输入是
100 1
那么输出应为100像素宽乘1像素高的全黑图像。
笔记
- 从stdin或命令行获取输入字符串或包含该字符串的文本文件的名称,或者可以编写一个包含字符串的函数。
- “输出”图像意味着:
- 用您选择的名称将其保存到文件中。
- 将原始图像文件数据打印到stdout。
- 显示图像,例如使用PIL的
image.show()
。
- 我不会检查您的图像是否是像素完美的(无论如何,Stack Exchange都会有损压缩图像),但是如果我能从视觉上分辨出任何区别,我将非常怀疑。
- 您可以使用图形/图像库。
获奖
以字节为单位的最短提交获胜。如果有平局,则最早提交者获胜。
有趣的奖金:提供输入以获得真正壮观的输出图像。