CS 193P Winter 2010 - HelloPoly (мои полигоны вышли из строя) - PullRequest
0 голосов
/ 18 декабря 2010

Часть моих полигонов нарисована за пределами границ, и я не понимаю, почему.

Вот что я имею в виду:

Изображение 1 (восьмиугольник)

За исключением Квадрата и Шестиугольника, у остальных многоугольников есть части, которые вычерчены из границ.

Я распечатал координаты для некоторых из них, сгенерированных из метода (pointsForPolygonInRect), и это то, что я получил ...

Для 3-стороннего (треугольника):

"NSPoint: {139.99998, -16 }",

"NSPoint: {249.1192, 172.99998}",

"NSPoint: {30.880798, 173}"

Обратите внимание на y-значение "-16", я не понимаю, как метод (pointsForPolygonInRect) выдает отрицательные значения, алгоритм неправильный?

Я уверен, что скопировал и вставил исходный код, который был задан в задании № 3, непосредственно в мой класс PolygonView, не изменил его и все еще получил ту же ошибку.

Для 8-сторонних (восьмиугольник):

"NSPoint: {256.40881, 158.21811}",

"NSPoint: {188.21811, 226.40881 }",

"NSPoint: {91.781876, 226.40881 }",

"NSPoint: {23.591179, 158.21812}",

"NSPoint: {23.591179, 61.781887}",

"NSPoint: {91.781921, -6,4088364 }»,

"NSPoint: {188.21814, -6,4088135 * *} тысячи пятьдесят-одна»,

"NSPoint: {256.40884, 61.781944}"

Обратите внимание, что отрицательное значение также для восьмиугольника, также высота для моего класса PolygonView составляет всего 220, я не понимаю, как вывод метода 226.40881, из-за которого верхняя и нижняя линии выходят за границы.

Ниже приведен код drawRect и pointsForPolygonInRect (оба находятся в классе PolyView) ...

- (NSArray *)pointsForPolygonInRect:(CGRect)rect numberOfSides:(int)numberOfSides { 
     CGPoint center = CGPointMake(rect.size.width / 2.0, rect.size.height / 2.0); 
     float radius = 0.9 * center.x; 
     NSMutableArray *result = [NSMutableArray array];
     float angle = (2.0 * M_PI) / numberOfSides; 
     float exteriorAngle = M_PI - angle; 
     float rotationDelta = angle - (0.5 * exteriorAngle);
     for (int currentAngle = 0; currentAngle < numberOfSides; currentAngle++) { 
         float newAngle = (angle * currentAngle) - rotationDelta; 
         float curX = cos(newAngle) * radius; 
         float curY = sin(newAngle) * radius;
         [result addObject:[NSValue valueWithCGPoint:CGPointMake(center.x + curX, center.y + curY)]];
     } 
 return result;
}

- (void)drawRect:(CGRect)rect {
    // Drawing code.
    NSArray *arrayOfCoordinates = [self pointsForPolygonInRect:[self bounds]  numberOfSides:[polygon numberOfSides]];
    NSEnumerator *enumerator = [arrayOfCoordinates objectEnumerator];

    CGContextRef ct = UIGraphicsGetCurrentContext();

    NSLog(@"%@", arrayOfCoordinates);    // for checking purposes

    CGPoint firstCoordinatePoint = [[enumerator nextObject] CGPointValue];
    CGContextBeginPath(ct);
    CGContextMoveToPoint(ct, firstCoordinatePoint.x, firstCoordinatePoint.y);

    CGPoint nextCoordinatePoint;
    NSValue *coordinate;
    while (coordinate = [enumerator nextObject]) {
        nextCoordinatePoint = [coordinate CGPointValue];
        CGContextAddLineToPoint(ct, nextCoordinatePoint.x, nextCoordinatePoint.y);
    } 
    CGContextClosePath(ct);

    [[UIColor clearColor] setFill];
    [[UIColor blackColor] setStroke];
    CGContextDrawPath(ct, kCGPathFillStroke);
}

Я очень ценю любую помощь. Спасибо!

Ответы [ 2 ]

1 голос
/ 18 декабря 2010

Это не то, что вы делаете неправильно, это алгоритм, используемый в pointsForPolygonInRect:numberOfSides:

В том виде, как он написан, он хочет, чтобы PolygonView был квадратным (или близким к нему).Обратите внимание, что он вычисляет центральную точку, а затем основывает радиус на компоненте x центра.Это означает, что если ваш PolygonView шире, чем высокий, он в конечном итоге будет обрезать точки сверху и снизу.

Я взял 193P в '08 или '09, и сделал то же самое назначение, и мой код в основном идентичен вашему.Вот мое, как я его первоначально написал: https://img.skitch.com/20101218-c6df66k52ss5a1nnci88ek2a2d.jpg

Если я сделаю мой PolygonView короче, чем он в ширину, он в конечном итоге будет выглядеть так: https://img.skitch.com/20101218-ptjh5kmkwcrm9fsqustpfft2qj.jpg

Решение?Сделайте ваш PolygonView выше или уже.Или, если вы действительно мастер, измените алгоритм в pointsForPolygonInRect:numberOfSides, чтобы лучше обрабатывать неквадратные представления.:) (Подсказка: вам нужно изменить только одну строку кода.)

0 голосов
/ 18 декабря 2010

(Во второй раз повезло!)

Если это поможет, вот код, который я написал для создания пути, когда я выполнял то же самое задание два года назад:

CGContextBeginPath(context);
BOOL drawing = NO;
for (NSValue *value in points) {
    CGPoint point = [value CGPointValue];
    if (!drawing) {
        CGContextMoveToPoint(context, point.x, point.y);
        drawing = YES;
    } else {
        CGContextAddLineToPoint(context, point.x, point.y);
    }
}
CGContextClosePath(context);
...