Я знаю, что это старая ветка, но недавно я ее использовал, поэтому подумал, что я добавил некоторые изменения, которые я добавил, которые могут помочь некоторым людям.
Я использовал приведенный выше код, но с помощью центральной точки для установки первой вершины и смещения первой степени я смог создать многоугольник вокруг центральной точки. Я также добавил метод для расчета длины стороны на основе радиуса.
Вот что я придумал (код в Objective-C):
-(NSArray *) calculateVertices:(int)numSides center:(CGPoint)ctr{
NSMutableArray *vertices = [[NSMutableArray alloc] init];
if (numSides < 3) {
return vertices;
}
float deg = ((180.0 * (numSides-2) / numSides)-180)/2;
float step = 360.0 / numSides;
float rad = deg * (M_PI / 180);
double nSinDeg = sin(rad);
double nCosDeg = cos(rad);
int sl = [self calculateSideLength:numSides];
CGPoint firstPoint = CGPointMake(ctr.x, ctr.y-radius);
[vertices addObject:[NSValue valueWithCGPoint:firstPoint]];
for (int i = 1; i < numSides; i++) {
NSValue *vp = [vertices objectAtIndex:i-1];
CGPoint pp =[vp CGPointValue];
double x = pp.x - nCosDeg * sl;
double y = pp.y - nSinDeg * sl;
CGPoint np = CGPointMake(x, y);
[vertices addObject:[NSValue valueWithCGPoint:np]];
deg -= step;
rad = deg * (M_PI / 180);
nSinDeg = sin(rad);
nCosDeg = cos(rad);
}
return vertices;
}
-(int) calculateSideLength:(int)numSides{
int length = (2*radius)*sin(M_PI/numSides);
return length;
}
ПРИМЕЧАНИЕ: радиус установлен как свойство класса, поэтому вы нигде не видите его установленным. Кроме того, я не хотел, чтобы он генерировал исключение, если число сторон меньше 3, поскольку я проверял количество сторон в другом месте.
У меня просто вопрос, лучше ли передать длину стороны в качестве параметра или, как я, и вызвать метод из моего метода?