From 9cda53cf777aaa0626203cd7fa3aa670b605d603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gytis=20Repe=C4=8Dka?= Date: Sat, 27 Oct 2018 19:29:56 +0300 Subject: [PATCH] Added draw-image.go which draws circle using Midpoint circle algorithm. To output full circle I used to draw smaller circles inside up to center but eventually there are not filled pixels left. --- draw-image.go | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ draw-image.png | Bin 0 -> 10086 bytes 2 files changed, 76 insertions(+) create mode 100644 draw-image.go create mode 100644 draw-image.png diff --git a/draw-image.go b/draw-image.go new file mode 100644 index 0000000..cbddd61 --- /dev/null +++ b/draw-image.go @@ -0,0 +1,76 @@ +// Copyright 2018 Gytis Repečka. All rights reserved. +// Use of this source code is governed by a GNU GPL +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "os" + "image" + "image/color" + "image/png" + "image/draw" +) + +type Circle struct { + imageToDraw draw.Image + x, y, r int + c color.Color +} + +// https://en.wikipedia.org/wiki/Midpoint_circle_algorithm +func (circle *Circle) Draw() { + x := circle.r - 1 + y := 0 + dx := 1 + dy := 1 + err := dx - (circle.r * 2) + + for x > y { + circle.imageToDraw.Set(circle.x + x, circle.y + y, circle.c) + circle.imageToDraw.Set(circle.x + y, circle.y + x, circle.c) + circle.imageToDraw.Set(circle.x - y, circle.y + x, circle.c) + circle.imageToDraw.Set(circle.x - x, circle.y + y, circle.c) + circle.imageToDraw.Set(circle.x - x, circle.y - y, circle.c) + circle.imageToDraw.Set(circle.x - y, circle.y - x, circle.c) + circle.imageToDraw.Set(circle.x + y, circle.y - x, circle.c) + circle.imageToDraw.Set(circle.x + x, circle.y - y, circle.c) + + if err <= 0 { + y++ + err += dy + dy += 2 + } + if err > 0 { + x-- + dx += 2 + err += dx - (circle.r * 2) + } + + } +} + +func main() { + outFileName := "draw-image.png" + + // Create 400x300 image + imageToDraw := image.NewRGBA(image.Rect(0, 0, 400, 300)) + + var myCircle Circle + + + for r := 130; 0 < r; r-- { + myCircle = Circle{imageToDraw, 200, 150, r, color.RGBA{0, 200, 0, 255}} + myCircle.Draw() + } + + f, errf := os.OpenFile(outFileName, os.O_WRONLY|os.O_CREATE, 0600) + if errf != nil { + fmt.Println(errf) + return + } + defer f.Close() + png.Encode(f, imageToDraw) + fmt.Printf("Image written: %s\n", outFileName) +} diff --git a/draw-image.png b/draw-image.png new file mode 100644 index 0000000000000000000000000000000000000000..517da67b7902817606d8b98e4970f2630c4fa3bf GIT binary patch literal 10086 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