gpt4 book ai didi

iphone - 在 Paint Application 中撤消绘图

转载 作者:行者123 更新时间:2023-11-28 17:44:33 25 4
gpt4 key购买 nike

我正在使用 OpenGl 框架制作一个绘画应用程序,但我卡在了 UNDO/REDO 选项。我实现的代码是这样的:

  -(void)undo_called
{

artbrushAppDelegate *app=(artbrushAppDelegate *)[[UIApplication sharedApplication]delegate];
mbrushscale=app.brushscale;
brushimage=app.brush_image;
Erase=YES;
[self playRayundo];
}


-(void)playRayundo
{
artbrushAppDelegate *app=(artbrushAppDelegate *)[[UIApplication sharedApplication]delegate];
glColor4f(app.r1g,
app.b1g,
app.g1g,
0);
NSLog(@"%f",app.r1g);


if(undo != NULL)
{
for(int l = 0; l < [undo count]; l++)
{
//replays my writRay -1 because of location point
for(int p = 0; p < [[undo objectAtIndex:l]count]-1; p ++)
{
[self drawErase:[[[undo objectAtIndex:l]objectAtIndex:p]CGPointValue] toPoint:[[[undo objectAtIndex:l]objectAtIndex:p + 1]CGPointValue]];
}
}
}

Erase=NO;
glColor4f(app.rg,
app.bg,
app.gg,
kBrushOpacity);

}



-(void) drawErase:(CGPoint)start toPoint:(CGPoint)end

{
static GLfloat* eraseBuffer = NULL;
static NSUInteger eraseMax = 64;

NSUInteger vertexCount = 0,
count,
i;

[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

// Convert locations from Points to Pixels
CGFloat scale = 1.0;//self.contentScaleFactor;
start.x *= scale;
start.y *= scale;
end.x *= scale;
end.y *= scale;

// Allocate vertex array buffer
if(eraseBuffer == NULL)
eraseBuffer = malloc(eraseMax * 2 * sizeof(GLfloat));

// Add points to the buffer so there are drawing points every X pixels
count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y)) / kBrushPixelStep), 1);

for(i = 0; i < count; ++i)
{
if(vertexCount == eraseMax)
{
eraseMax = 2 * eraseMax;
eraseBuffer = realloc(eraseBuffer, eraseMax * 2 * sizeof(GLfloat));
}

eraseBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i / (GLfloat)count);
eraseBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i / (GLfloat)count);
vertexCount += 1;
}

[self ChangebrushPic:brushimage];

//the erase brush color is transparent.

glEnable(GL_POINT_SPRITE_OES);
glTexEnvf(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE);
glPointSize(64/mbrushscale);

// Render the vertex array

glVertexPointer(2, GL_FLOAT, 0, eraseBuffer);
glDrawArrays(GL_POINTS, 0, vertexCount);


// Display the buffer
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

// at last restore the mixed-mode
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

}

这段代码效率不高,而且有很多错误。看看撤消前后的图像。

之前:http://imageshack.us/photo/my-images/577/screenshot20110714at121.png/

之后:http://imageshack.us/photo/my-images/200/screenshot20110714at121.png/

所以我想在每次用户的 Touch 结束时将图像保存在缓冲区中并在 UNDO 上调用之前的图像..任何人都可以帮助我如何将图像存储在缓冲区中并在 UNDO 上取回?我试图找到它的示例代码,但找不到..

谢谢..

最佳答案

好的。我发布了我自己的问题的答案,因为似乎有很多人提到这个问题。

有一个名为TouchPainter 的应用程序及其source code可用。它包含绘图、颜色混合、撤消/重做(惊人的..!!)、保存/打开绘图..

注意:它可能需要非常深入的Objective C设计模式知识(我仍然不知道什么是设计模式。但我找到了它,所以我正在分享..)。整个应用程序的源代码在“Apress.Pro Objective-C Design Patterns for iOS”这本书中进行了解释。

希望对您有所帮助..:)祝您好运..

关于iphone - 在 Paint Application 中撤消绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6689600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com