2015-02-27 3 views
0

Я пытаюсь нарисовать круг на NSImage, а затем отобразить его на экране. Я хочу сделать это несколько раз, чтобы с каждым новым кругом старые не показывались. Если я использую код ниже, круг рисуется, но каждый раз, когда я рисую новый, старые все еще присутствуют.рисунок на NSImage

-(void)drawPointToImage:(float)x y:(float)y 
{ 
    // drawpoint and update 
    float diameter1 = 20, x_plot, y_plot; // keep diameter1 

    if (isnan(x) || isnan(y) || x < 0.0001 || y < 0.0001) { 
     return; 
    } 

    x_plot = [self xToScreen:x]; 
    y_plot = [self yToScreen:y]; 

    NSImage *image = [[NSImage alloc]initWithSize:NSMakeSize(canvasWidth, canvasHeight)]; // start with clean image 
    image = [NSImage imageNamed:@"538x598.png"];//orginalImage; 

    NSRect myRect1 = NSMakeRect(x_plot, y_plot, diameter1, diameter1); 
    NSBezierPath *path1; 
    path1 = [NSBezierPath bezierPathWithOvalInRect:myRect1]; 
    [[NSColor blackColor] set]; 
    [path1 fill]; 

    imageView.image = image; // display to screen 
} 

Итак, я попробовал следующее, но теперь круги не нарисованы вообще. Как я могу нарисовать круг на новом изображении каждый раз?

-(void)drawPointToImage:(float)x y:(float)y 
{ 
    // drawpoint and update 
    float diameter1 = 20, x_plot, y_plot; // keep diameter1 

    if (isnan(x) || isnan(y) || x < 0.0001 || y < 0.0001) { 
     return; 
    } 

    x_plot = [self xToScreen:x]; 
    y_plot = [self yToScreen:y]; 

    NSImage *image = [[NSImage alloc]initWithSize:NSMakeSize(canvasWidth, canvasHeight)]; // start with clean image 
    image = [NSImage imageNamed:@"538x598.png"];//orginalImage; 

    [image lockFocus]; 

    NSRect myRect1 = NSMakeRect(x_plot, y_plot, diameter1, diameter1); 
    NSBezierPath *path1; 
    path1 = [NSBezierPath bezierPathWithOvalInRect:myRect1]; 
    [[NSColor blackColor] set]; 
    [path1 fill]; 

    [image unlockFocus]; 

    imageView.image = image; // display to screen 
} 
+0

Я не уверен, я понимаю, почему вы используете изображения на всех, но когда вы назначаете 'image' используя' ImageName: ', вы выбрасываете (и утечки) тот, который вы alloc'd в предыдущая строка. – JWWalker

+0

У меня есть диаграмма, на которой я хочу построить точку, эта точка меняется, поэтому я начинаю с чистого изображения каждый раз, а затем рисую новую точку, я не хочу, чтобы предыдущие точки оставались. Я использую ARC, поэтому я думал, что это позаботится об утечке. – user1390106

+0

Возможно, ARC позаботится об утечке, но по-прежнему бессмысленно бросать объект сразу после его создания. – JWWalker

ответ

0

Это работает. По какой-то причине команда «drawAtPoint» doo snot работает, изображение не рисуется. Кроме того, изображение скачет примерно на 20 пикселей вниз и направо во второй раз, когда это вызвано.

-(void)drawRect:(NSRect)rect 
{ 
// return; 
    // drawpoint and update 
    float diameter1 = 10, x_plot, y_plot; 

    if (isnan(Cx) || isnan(Cy) || Cx < 0.0001 || Cy < 0.0001) { 
     return; 
    } 

    x_plot = [self xToScreen:x]; // x is class-wide 
    y_plot = [self yToScreen:y]; // y is class-wide 


    NSImage *image;// = [[NSImage alloc]initWithSize:NSMakeSize(cieCanvasWidth, cieCanvasHeight)]; // start with clean image 
    image = orginalImage; // start with clean image; orginalImage is class-wide 

    [NSGraphicsContext saveGraphicsState]; 

    [image drawInRect:cieRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 
// [image drawAtPoint:CGPointMake(500,500) fromRect:cieRect operation:NSCompositeSourceOver fraction:1.0]; 

    // draw point 
    NSRect myRect1 = NSMakeRect(x_plot, y_plot, diameter1, diameter1); 
    NSBezierPath *path1; 
    path1 = [NSBezierPath bezierPathWithOvalInRect:myRect1]; 
    [[NSColor blackColor] setFill]; 
    [path1 fill]; 

    [NSGraphicsContext restoreGraphicsState]; 

}