|
@@ -0,0 +1,69 @@
|
|
|
+import "random" for Random
|
|
|
+
|
|
|
+class GrayscaleImage {
|
|
|
+ construct new(width, height, depth) {
|
|
|
+ _width = width
|
|
|
+ _height = height
|
|
|
+ _depth = depth
|
|
|
+ _image = []
|
|
|
+ for (y in 0...height) {
|
|
|
+ _image.add(List.filled(width, 0))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pixel(x, y, shade) {
|
|
|
+ _image[y][x] = shade
|
|
|
+ }
|
|
|
+
|
|
|
+// «rectangle»
|
|
|
+ rectangle(x, y, width, height, shade) {
|
|
|
+ // the two horizontal lines
|
|
|
+ for (dx in 0..width) {
|
|
|
+ pixel(x + dx, y, shade)
|
|
|
+ pixel(x + dx, y + height, shade)
|
|
|
+ }
|
|
|
+
|
|
|
+ // the two vertical lines
|
|
|
+ for (dy in 0..height) {
|
|
|
+ pixel(x, y + dy, shade)
|
|
|
+ pixel(x + width, y + dy, shade)
|
|
|
+ }
|
|
|
+ }
|
|
|
+// «end»
|
|
|
+
|
|
|
+ showPGM() {
|
|
|
+ System.print("P2") // the PGM header
|
|
|
+ System.print("%(_width) %(_height)")
|
|
|
+ System.print(_depth) // the maximum value which will appear
|
|
|
+ for (y in 0..._height) {
|
|
|
+ for (x in 0..._width) {
|
|
|
+ System.write("%(_image[y][x]) ")
|
|
|
+ }
|
|
|
+ System.print()
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+var rand = Random.new()
|
|
|
+
|
|
|
+var width = 24
|
|
|
+var height = 24
|
|
|
+var depth = 8
|
|
|
+
|
|
|
+// «main»
|
|
|
+var image = GrayscaleImage.new(width, height, depth)
|
|
|
+// create up to 6 rectancles
|
|
|
+for (i in 0..rand.int(3, 6)) {
|
|
|
+ // choose the color from the depth
|
|
|
+ var color = rand.int(2, 8)
|
|
|
+ // choose top-left point randomly
|
|
|
+ var x = rand.int(0, width-3)
|
|
|
+ var y = rand.int(0, height-3)
|
|
|
+ // choose width and height from remaining
|
|
|
+ var w = rand.int(x+2, width) - x
|
|
|
+ var h = rand.int(y+2, height) - y
|
|
|
+ // draw the rectangle
|
|
|
+ image.rectangle(x, y, w, h, color)
|
|
|
+}
|
|
|
+image.showPGM()
|
|
|
+// «end»
|