2013-11-23 3 views
0

Краткая история заключается в том, что я хотел бы получить границы (я думаю, что я имею в виду границы вместо кадра) NSBezierPath, чтобы заполнить представление. Что-то вроде этого: mapПеревод представления с помощью пути (ObjectiveC, Cocoa)

Для создания вышеуказанного изображения я масштабировал/переводил каждую точку в моем созданном пути, используя информацию от Covert latitude/longitude point to a pixels (x,y) on mercator projection. Проблема в том, что это не масштабируется (я буду добавлять еще много путей), и я хочу легко добавить функции панорамирования/масштабирования для своего представления. Кроме того, я хочу, чтобы удар оставался неизменным независимо от масштаба (т. Е. Без жировых границ при увеличении).

Кажется, я хочу, чтобы создать повторно используемый путь в некоторой произвольной системе отсчета (например долготы и широты модифицированную) вместо того, чтобы генерировать новый путь каждый раз, когда изменения окна. Затем я могу перевести/масштабировать систему координат моего представления, чтобы заполнить представление с помощью пути.

Таким образом, я использовал Apple's geometry guide для изменения рамки представления. Я получил перевод правильно, но масштабирование не удалось.

[self setBoundsOrigin:self.path.bounds.origin]; 

map fail

[self scaleUnitSquareToSize:NSMakeSize(1.5, 1.5)]; 

map fail

Тогда я попробовал coordinate system transformation в моем DrawRect: метод только в конечном итоге с аналогичным результатом.

NSAffineTransform* xform = [NSAffineTransform transform]; 
[xform translateXBy:(-self.path.bounds.origin.x) yBy:(-self.path.bounds.origin.y)]; 
[xform scaleXBy:1.5 yBy:1.5]; 
[xform concat]; 

map fail again

Наконец я попытался вручную настройки просмотра границ в DrawRect: но результат был некрасив и очень медленно!

arg

Я знаю, что я могу также преобразовать объект NSBezierPath, и я думаю, что будет работать, но я предпочел бы трансформировать представление один раз вместо того, чтобы циклически и преобразования каждого пути каждое обновление. Я думаю, что есть три строки кода, которые я пропускаю, что будет делать именно то, что я ищу.

Edit: Вот DrawRect: метод я использую:

- (void)drawRect:(NSRect)dirtyRect 
{ 
// NSAffineTransform* xform = [NSAffineTransform transform]; 
// [xform translateXBy:-self.path.bounds.origin.x yBy:-self.path.bounds.origin.y]; 
// [xform scaleXBy:1.5 yBy:1.5]; 
// [xform concat]; 

[self drawBoundaries]; 
NSRect bounds = [self bounds]; 
[[NSColor blackColor] set]; 
[NSBezierPath fillRect:bounds]; 

// Draw the path in white 
[[NSColor whiteColor] set]; 
[self.path stroke]; 

[[NSColor redColor] set]; 
[NSBezierPath strokeRect:self.path.bounds]; 
NSLog(@"path origin %f x %f",self.path.bounds.origin.x, self.path.bounds.origin.y); 
NSLog(@"path bounds %f x %f",self.path.bounds.size.width, self.path.bounds.size.height); 
} 
+0

Не хотите ли изменить размер границ, а не происхождение? –

+0

Границы пути имеют начало -124.87 x 25.17 и размер 58.01 x 31.79. –

+0

Я имел в виду, если вы хотите масштабировать чертеж, вы должны изменить границы, но это также уменьшит толщину линии ... можно ли увидеть вашу реализацию 'drawRect:'? –

ответ

0

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

- (void)transformPath:(NSBezierPath *)path 
{ 
NSAffineTransform *translateTransform = [NSAffineTransform transform]; 
NSAffineTransform *scaleTransform = [NSAffineTransform transform]; 

[translateTransform translateXBy:(-self.path.bounds.origin.x) 
          yBy:(-self.path.bounds.origin.y)]; 

float scale = MIN(self.bounds.size.width/self.path.bounds.size.width, 
        self.bounds.size.height/self.path.bounds.size.height); 
[scaleTransform scaleBy:scale]; 

[path transformUsingAffineTransform: translateTransform]; 
[path transformUsingAffineTransform: scaleTransform]; 
} 
Смежные вопросы