【发布时间】:2011-06-11 22:59:09
【问题描述】:
我很确定这更像是一道数学题,但我会在 UIView 和 iPad 相关目标 C 的上下文中表述它
我正在从从其他地方下载的一些公共领域材料创建的映射文件中导入原始数据,然后拆分以隔离地图中的各个区域。每个区域都有许多子区域,例如美国大陆,然后是出现在美国内部的各个州,然后每个子区域再次细分,例如县。
每个州和每个县都有一个边界框,它告诉我每个州的原点、宽度和高度。
在我的初始设置中,我为每个州创建了一个单独的视图,然后为每个县创建了另一个视图。相对于我通过名为 mainContainerView 的界面构建器创建的视图,呈现了代表州/县区域的多边形(显然县位于州顶部,因此它是可见的)。此初始设置工作正常。
现在我正在尝试稍微改变一下,通过将县添加到持有该州多边形的 UIView 中,这样我就可以将州作为剪贴蒙版覆盖在县上。问题是,无论我尝试什么,我似乎都无法让该县翻译到该州认为的正确位置。
看起来应该是简单的加法或减法,因为每个项目的缩放比例完全相同,而且我没有尝试进行任何重大转换,因此我认为不需要 CFaffineTransformation 系列。
如有必要,我可以发布代码,但我并不是要找人为我编写程序;我只是希望有人在这里为我指明正确的方向,给我一个关于如何在州的视图中相对于州设置县的建议。
根据要求,这是我现在正在处理的相关代码。这段代码不起作用,但它让你知道我在做什么。发布样本数据有点困难,因为它涉及从旨在生成地图(和细分)的 .SHP 文件中提取的点数组和数据。我将在代码中包含一些带有一些实际点值的 cmets,因为我逐步通过程序向您展示它们发生了什么。
MASK_MAX_EASTING、MASK_MAX_NORTHING、MASK_MIN_EASTING 和 MASK_MIN_NORTHING 是定义由州组成的整个国家地图的边界框的常量。
DIST_MAX_EASTING、DIST_MAX_NORTHING、DIST_MIN_EASTING 和 DIST_MIN_NORTHING 是定义由县组成的国家地图的边界框的常量。两张地图的比例略有不同,因此,通过使用不同的边界框,我已经能够将两张地图缩放到相同的大小。
-(void)didLoadMap:(NSNotification *)notification {
id region = [notification object];
ShapePolyline *polygon = [region polygon];
if ([notification name] == @"MapsLoadingForState") {
// m_nBoundingBox is an array which contains the RAW northing and easting values for each subdivision. [0] - west limit, [1] - south limit, [2] - east limit, [3] - north limit.
// The code below, combined with the drawrect method in DrawMap.m (below) puts all the states on the map in precisely the right places, so for the state maps, it works just fine.
CGFloat originX = ((polygon->m_nBoundingBox[0]-MASK_MIN_EASTING)*stateScaleMultiplier)+([mainContainerView frame].size.width/2);
CGFloat originY = ((MASK_MAX_NORTHING-(polygon->m_nBoundingBox[3]))*stateScaleMultiplier)+[mainContainerView frame].origin.y;
CGFloat width = polygon->m_nBoundingBox[2] - polygon->m_nBoundingBox[0];
CGFloat height = polygon->m_nBoundingBox[3] - polygon->m_nBoundingBox[1];
CGFloat scaledWidth = width*stateScaleMultiplier;
CGFloat scaledHeight = height*stateScaleMultiplier;
UIColor *subViewColor = [UIColor colorWithRed:0.0 green:1.0 blue:1.0 alpha:0.0];
stateMapView = [[DrawMap alloc] initWithFrame:CGRectMake(originX, originY, scaledWidth, scaledHeight)];
[stateMapView setBackgroundColor:subViewColor];
[stateMapView setStateScale:stateScaleMultiplier];
[stateMapView setCountyScale:countyScaleMultiplier]; // Not actually needed.
[stateMapView setClippingMask:polygon];
UIColor *colorMask = [UIColor colorWithWhite:1.0 alpha:1.0];
[stateMapView setForeground:colorMask];
[states addObject:stateMapView]; // Add the state map view to an array (for future use)
[mapView addSubview:stateMapView]; // MapView is a UIView of equivalent size and shape as mainContainerView.
} else {
// This is where the problems occur.
CGFloat originX = (polygon->m_nBoundingBox[0]-DIST_MIN_EASTING); // 4431590 (raw data)
originX *= countyScaleMultiplier; // 303.929108
originX += ([mainContainerView frame].size.width/2); // 815.929077
CGFloat originY = (DIST_MAX_NORTHING-polygon->m_nBoundingBox[3]); 4328997
originY *= countyScaleMultiplier; // 296.893036
originY -= [mainContainerView frame].origin.y; // 340.893036
CGRect frame = [stateMapView frame]; // Dummy variable created for watches in the debugger. x=856.237183, y=332.169922 width=34.3800087, height=28.7534008
// When I was invoking DrawMap.h and the included drawrect method, the county map would easily be displayed in the right place, as you can see by the values above.
// This is where I think the problem is. The X value is WAY off as far as I can tell.
originX -= frame.origin.x; // -40.3081055
originY -= frame.origin.y; // 8.72311401
CGPoint countyOrigin = CGPointMake(originX,originY);
// Translate the county's origin so it is relative to the origin of stateMapView, not MainContainerView (doesn't work)
[stateMapView addCountyMap:[region polygon] withColor:winner translatedBy:countyOrigin];
[stateMapView setNeedsDisplay];
}
我知道此代码存在几个问题,并且此问题范围之外的一些内容可能会让你们中的一些人(或两个)挑起眉毛,但这绝对是一项正在进行的工作......
这里是 DrawMap.m 的相关代码;我删掉了一堆东西,因为它们是无关的。
- (void)drawRect:(CGRect)rect {
// Set up
for (int i=0;i<[countyMaps count];i++) {
// Draw the polygon.
[[countyColors objectAtIndex:i] setFill];
[self drawPolygon:[countyMaps objectAtIndex:i]
usingScale:stateScale
translatedBy:CGPointMake([[countyTranslations objectAtIndex:2*i] floatValue],
[[countyTranslations objectAtIndex:2*i+1] floatValue])];
}
// Set the blend mode to multiply
CGContextSetBlendMode(context, kCGBlendModeMultiply);
// Draw a path with clippingMask
[[UIColor colorWithWhite:1.0 alpha:1.0] setFill];
// CGPoint translate = CGPointMake(0,0);
[self drawPolygon:clippingMask usingScale:stateScale translatedBy:CGPointMake(0,0)];
}
-(void)drawPolygon:(ShapePolyline *)aPolygon usingScale:(float)mapScale translatedBy:(CGPoint)trans {
for (int j=0;j<[aPolygon numParts];j++) {
UIBezierPath *path = [UIBezierPath bezierPath];
[path setLineJoinStyle:kCGLineJoinRound];
int startIndex = [[[aPolygon m_Parts] objectAtIndex:j] intValue];
int endIndex = [aPolygon numPoints];
CGPoint startPoint;
[[[aPolygon m_Points] objectAtIndex:startIndex] getValue:&startPoint];
startPoint.x *=mapScale;
startPoint.y *=mapScale;
startPoint.x -= trans.x;
startPoint.y -= trans.y;
[path moveToPoint:startPoint];
if (j+1 != [aPolygon numParts]){
endIndex = [[[aPolygon m_Parts] objectAtIndex:j+1] intValue];
}
for (int k=startIndex+1; k<endIndex; k++)
{
CGPoint nextPoint;
[[[aPolygon m_Points] objectAtIndex:k] getValue:&nextPoint];
nextPoint.x *= mapScale;
nextPoint.y *= mapScale;
nextPoint.x -= trans.x;
nextPoint.y -= trans.y;
[path addLineToPoint:nextPoint];
}
[path closePath];
// [path stroke];
[path fill];
}
}
这本书真的可能信息太多,也可能不够。无论哪种方式,希望通过添加代码,我已经为您提供了一些信息......
【问题讨论】:
-
请发布尝试定位视图的代码以及一些示例数据。我们需要先看看发生了什么,然后才能找出问题所在。
-
根据 ughoavgfhw 的要求添加的代码。
-
只是一个猜测......但是
[stateMapView addCountyMap:[region polygon] withColor:winner translatedBy:countyOrigin];这是期待原点的倒数吗? -
看起来你可能没有对框架原点做出正确的假设,因为它们是本地原点而不是窗口的全局原点。那就是你减去[mainContainerView frame].origin.y和frame.origin.y,不确定但看起来不对。
-
我的理解是 [view bounds] 返回视图的本地坐标系,而 [view frame] 给出了相对于 superview 的坐标系,在这种情况下,这就是我所需要的。我不确定你对原点的倒数有什么看法......
标签: objective-c uiview translation coordinates coordinate-systems