2
일부 맞춤 코드를 사용하여 등각 투영 사각형을 그려 픽셀 데이터를 작성한 다음 putImageData를 사용하여 캔버스에 배치하려고합니다.HTML5 canvas putImageData 예상치 못한 결과를 얻지 못하는 픽셀로 보입니다.
캔버스의 원시 픽셀 데이터를 통해 예상 한 결과를 얻지 못했지만 모든 픽셀 데이터가 엉망으로 된 것 같습니다.
아래 코드에서 원하는 것은 검정 바탕에 빨간색 다이아몬드입니다. 내가 어디로 잘못 가고 있니?
var Drawing = {};
Drawing.DrawIsoMetricSquare = function(cRenderContext, x, y, iWidth, cColor) {
var iHeight = iWidth/2;
var iYPos = Math.floor(iHeight/2) + 1;
var iXPos = 0;
var iRenderGirth = 1;
cPixelData = cRenderContext.createImageData(iWidth, iHeight);
var bExpand = true;
while (iXPos != iWidth) {
var iCurrentRenderGirth = 0;
while (iCurrentRenderGirth != iRenderGirth) {
var iY = iYPos + iCurrentRenderGirth;
//Draw first pixel then second
Drawing.ColorPixelAtPos(cPixelData.data, iXPos, iY, iWidth, cColor);
Drawing.ColorPixelAtPos(cPixelData.data, iXPos + 1, iY, iWidth, cColor);
iCurrentRenderGirth++;
}
//Move to next Render Start
iYPos = bExpand ? (iYPos - 1) : (iYPos + 1);
iXPos += 2;
iRenderGirth = bExpand ? (iRenderGirth + 2) : (iRenderGirth - 2);
bExpand &= iRenderGirth < iHeight;
}
cRenderContext.putImageData(cPixelData, x, y);
};
Drawing.XYPosToPixelPos = function(x, y, iWidth) {
return (x + y * iWidth) * 4;
};
Drawing.ColorPixelAtPos = function(cPixelData, x, y, iWidth, cColor) {
var iPixPos = Drawing.XYPosToPixelPos(x, y, iWidth);
cPixelData[iPixPos++] = cColor.r;
cPixelData[iPixPos++] = cColor.g;
cPixelData[iPixPos++] = cColor.b;
cPixelData[iPixPos] = 1; //Fixed alpha for now
};
var eCanvas = $("<canvas></canvas>");
eCanvas[0].width = 50;
eCanvas[0].height = 50;
$("#render").append(eCanvas);
var cRenderContext = eCanvas[0].getContext('2d');
cRenderContext.fillStyle = "rgba(1, 1, 1, 1)";
cRenderContext.fillRect(0, 0, 50, 50);
Drawing.DrawIsoMetricSquare(cRenderContext, 0, 0, 42, {
r: 255,
g: 0,
b: 0
});
JSFiddle 예를 here
수학 문제를 파악하지 못했지만 빨간색을 보려면 고정 알파가 1이 아닌 255가되어야합니다. 적어도 흰색 배경에 빨간색 v 모양이 나타납니다. –
그게 메신저가 잘못 됐어? 나는 알파가 0과 1 사이라고 생각 했습니까? 또는 픽셀 데이터가 CSS rgba와 비교하여 다른가요? – Tristan
나는 또한 그것의 아주 버그 투성이이며 이미 테스트 한 것을 볼 수 없었기 때문에 예상했던 모양을 만들지 못했다. – Tristan