我正在為 Android 創建一個像素藝術編輯器,最近我使用中點橢圓演算法實作了一個橢圓工具。
我想強調一下,這個工具可以完美運行!
唯一的問題是,如果我在更大的位圖(大約 1000x1000 或更大)上繪制一個大橢圓,橢圓的邊會被切割,并且會發生一些奇怪的行為:


我真的很困惑為什么會發生這種情況,我將不勝感激。
中點橢圓演算法的代碼:
package com.therealbluepandabear.pixapencil.algorithms
import com.therealbluepandabear.pixapencil.activities.canvas.canvascommands.overrideSetPixel
import com.therealbluepandabear.pixapencil.models.Coordinates
class MidpointEllipseAlgorithm(private val algorithmInfo: AlgorithmInfoParameter, private val xDEC: Boolean = false, private val yDEC: Boolean = false, private val filledMode: Boolean = false) {
private val shouldLineIgnoreBrush = true
private fun putPixel(p1: Coordinates, p2: Coordinates) {
val xc = p1.x
val yc = p1.y
val x = p2.x
val y = p2.y
if (!xDEC && !yDEC) {
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc x, yc y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc x, yc - y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc - x, yc - y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc - x, yc y),
algorithmInfo.color
)
if (filledMode) {
val lineAlgorithmInstance = LineAlgorithm(algorithmInfo, shouldLineIgnoreBrush)
lineAlgorithmInstance.compute(
Coordinates(xc x, yc y),
Coordinates(xc x, yc - y),
)
lineAlgorithmInstance.compute(
Coordinates(xc - x, yc - y),
Coordinates(xc - x, yc y),
)
}
} else if (xDEC && !yDEC) {
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates((xc x) 1, yc y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates((xc x) 1, yc - y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc - x, yc - y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc - x, yc y),
algorithmInfo.color
)
if (filledMode) {
val lineAlgorithmInstance = LineAlgorithm(algorithmInfo, shouldLineIgnoreBrush)
lineAlgorithmInstance.compute(
Coordinates((xc x) 1, yc y),
Coordinates((xc x) 1, yc - y),
)
lineAlgorithmInstance.compute(
Coordinates(xc - x, yc - y),
Coordinates(xc - x, yc y),
)
}
} else if (!xDEC && yDEC) {
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc x, (yc y) 1),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc x, yc - y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc - x, yc - y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc - x, (yc y) 1),
algorithmInfo.color
)
if (filledMode) {
val lineAlgorithmInstance = LineAlgorithm(algorithmInfo, shouldLineIgnoreBrush)
lineAlgorithmInstance.compute(
Coordinates(xc x, (yc y) 1),
Coordinates(xc x, yc - y),
)
lineAlgorithmInstance.compute(
Coordinates(xc - x, yc - y),
Coordinates(xc - x, (yc y) 1),
)
}
} else {
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates((xc x) 1, (yc y) 1),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates((xc x) 1, yc - y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc - x, yc - y),
algorithmInfo.color
)
algorithmInfo.canvasCommandsHelperInstance.overrideSetPixel(
Coordinates(xc - x, (yc y) 1),
algorithmInfo.color
)
if (filledMode) {
val lineAlgorithmInstance = LineAlgorithm(algorithmInfo, shouldLineIgnoreBrush)
lineAlgorithmInstance.compute(
Coordinates((xc x) 1, (yc y) 1),
Coordinates((xc x) 1, yc - y),
)
lineAlgorithmInstance.compute(
Coordinates(xc - x, yc - y),
Coordinates(xc - x, (yc y) 1),
)
}
}
}
fun compute(p1: Coordinates, rx: Int, ry: Int) {
val idp = Coordinates(0, ry)
var xkp1 = idp.x
var ykp1 = idp.y
var lxkp1: Int
var lykp1: Int
var p1k = (ry * ry) ((rx * rx) / 4) - (ry * (rx * rx))
val incy = p1.y
val incx = p1.x
putPixel(Coordinates(incx, incy), Coordinates(xkp1, ykp1))
while (
(2 * (xkp1 1) * (ry * ry))
<
(2 * ykp1 * (rx * rx))
) {
p1k = if (p1k >= 0) {
xkp1
ykp1--
lxkp1 = xkp1 - 1
lykp1 = ykp1 1
(ry * ry) (2 * (lxkp1 1)) * (ry * ry) (rx * rx) * ((ykp1 * ykp1) - (lykp1 * lykp1)) - (rx * rx) * (ykp1 - lykp1)
} else {
xkp1
lxkp1 = xkp1 - 1
lykp1 = ykp1
(ry * ry) (2 * (lxkp1 1)) * (ry * ry) (rx * rx) * ((ykp1 * ykp1) - (lykp1 * lykp1))
}
putPixel(Coordinates(incx, incy), Coordinates(xkp1, ykp1))
}
var p2k = (ry * ry) * ((xkp1 0.5) * (xkp1 0.5)) (rx * rx) * ((ykp1 - 1) * (ykp1 - 1)) - ((rx * rx) * (ry * ry))
while (
ykp1 > 0
) {
if (p2k >= 0) {
ykp1--
lykp1 = ykp1 1
lxkp1 = xkp1
p2k = (rx * rx) - 2 * (rx * rx) * (lykp1 - 1) (ry * ry) * ((xkp1 * xkp1) - (lxkp1 * lxkp1))
} else {
xkp1
lxkp1 = xkp1 - 1
ykp1--
lykp1 = ykp1 1
p2k = (rx * rx) - 2 * (rx * rx) * (lykp1 - 1) (ry * ry) * ((xkp1 * xkp1) - (lxkp1 * lxkp1)) (ry * ry) * (xkp1 - lxkp1)
}
putPixel(Coordinates(incx, incy), Coordinates(xkp1, ykp1))
}
}
}
該問題僅存在于 中MidpointEllipseAlgorithm,因此已被隔離。該overrideSetPixel函式不會導致這種行為,因為當我用一個簡單Bitmap.setPixel的替換它時,問題仍然存在。但是,盡管它已被隔離,但我很困惑為什么會發生這種情況。
如果您在較小的畫布上繪制橢圓,則不會顯示此行為,但效果很好。僅當您在演示此行為的大位圖上繪制足夠大小的橢圓時。
任何關于為什么在大型位圖上像這樣被“剪切”的幫助或指示將不勝感激。這是您完全不知道為什么會發生的問題之一,這完全是荒謬的,因為我的同行已經對演算法本身進行了審查,并且達到了很高的標準。我已經嘗試了幾個小時來通過調整變數和不等式來修復它,但我不知道它來自哪里,我什至將我的演算法代碼與在線代碼進行了比較,即使我更換它,我也遇到了問題。
uj5u.com熱心網友回復:
通過將以下內容轉換為double:
var p2k = (ry.toDouble() * ry.toDouble()) * ((xkp1.toDouble() 0.5) * (xkp1.toDouble() 0.5)) (rx.toDouble() * rx.toDouble()) * ((ykp1.toDouble() - 1) * (ykp1.toDouble() - 1)) - ((rx.toDouble() * rx.toDouble()) * (ry.toDouble() * ry.toDouble()))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/492035.html
上一篇:查找所有可能的功能組合
