1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
該image.Image
類型是一個(gè)接口,它將圖像定義為具有整數(shù)坐標(biāo)的像素,可通過以下Image.At()
方法訪問:
At(x,?y?int)?color.Color
您使用的具體實(shí)現(xiàn)image.RGBA
允許再次使用整數(shù)坐標(biāo)和方法來更改像素RGBA.Set()
:
func?(p?*RGBA)?Set(x,?y?int,?c?color.Color)
最簡(jiǎn)單的解決方案是將浮點(diǎn)坐標(biāo)轉(zhuǎn)換為整數(shù)坐標(biāo)。簡(jiǎn)單地將浮點(diǎn)轉(zhuǎn)換為整數(shù)就是截?cái)?,因此您?yīng)該使用舍入。0.5
在轉(zhuǎn)換之前添加一個(gè)簡(jiǎn)單的舍入。
最好是在“開始”坐標(biāo)上執(zhí)行此操作,以便循環(huán)可以使用整數(shù)值,例如:
func drawHLine(img *image.RGBA, startX, y, endX float32) {
? ? col := color.RGBA{0x00, 0x00, 0x00, 0xff}
? ? x1, x2 := int(startX + 0.5), int(endX + 0.5)
? ? y1 := int(y + 0.5)
? ? for x := x1; x <= x2; x++ {
? ? ? ? img.Set(x, y1, col)
? ? }
}
請(qǐng)注意,但是這種將浮點(diǎn)坐標(biāo)轉(zhuǎn)換為整數(shù)的“最簡(jiǎn)單”解決方案可能不是“最佳”。例如,如果您需要在坐標(biāo)處繪制一條水平線x = 0.1
,則上述解決方案將在 處繪制一條線x = 0
。一種不同的解決方案可能是在 處畫一條“較強(qiáng)”的線x = 0
,在 處畫一條“較弱”的線,從而給出從遠(yuǎn)處觀察時(shí)x = 1
該線實(shí)際上位于 處的效果。x = 0.1
如果線條不是水平和垂直的,這種混疊技術(shù)肯定會(huì)給出更好的結(jié)果,但需要更多的計(jì)算(因此速度更慢)。
如果您在繪圖時(shí)確實(shí)需要浮動(dòng)精度,您可以使用第 3 方庫(kù),例如github.com/fogleman/gg
它允許您傳遞float64
坐標(biāo),并且它使用抗鋸齒來實(shí)現(xiàn)良好的結(jié)果。
例如,在圖像github.com/fogleman/gg
上繪制一個(gè)矩形image.RGBA
,如下所示:
var img *image.RGBA = // create your RGBA image
ctx := gg.NewContextForRGBA(img)
// Set drawing color:
ctx.SetColor(color.RGBA{0x00, 0x00, 0x00, 0xff})
// Or simply: ctx.SetRGB(0, 0, 0)
// Draw rectangle: x, y, w, h are all float64 parameters
ctx.DrawRectangle(x, y, w, h)
- 1 回答
- 0 關(guān)注
- 206 瀏覽
添加回答
舉報(bào)