2010-03-21 4 views
5

이 주제는 한 두 번이나 긁어졌지만 여전히 의아해하고 있습니다. 그리고 구글도 우호적이지 않았다.퍼지 드로잉을 피하는 스케일링으로 사용자 Quartz2D 좌표계를 설정하는 방법은 무엇입니까?

Quartz는 아핀 변환을 사용하는 임의의 좌표계를 허용하므로 실재 좌표를 사용하여 평면도 같은 것을 그릴 수 있어야합니다. 피트.

기본적으로 예를 들어 10x10 직사각형을 그릴 때 (예 : 10 인치 상자를 생각할 때) 60x60 픽셀의 직사각형이 표시되도록 뷰의 크기를 조정하고 싶습니다.

나가 얻는 직사각형을 제외하고 그것은 작동한다, 아주 희소하다. 또 다른 질문은 이유를 설명하는 대답이 있습니다. 그러나 나는 그 이유를 이해하고 왜 그것을 고쳐야할지 모르겠다. 내 awakeFromNib 사용자 지정보기 방법에 내 좌표계를 설정

: 내가 얻을 사각형이 잘

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGRect r = CGRectMake(10., 10., 10., 10.); 
    CGFloat lineWidth = 1.0; 
    CGContextStrokeRectWithWidth(context, r, lineWidth); 
} 

을 조정됩니다 :

- (void) awakeFromNib { 
    CGAffineTransform scale = CGAffineTransformMakeScale(6.0, 6.0); 
    self.transform = scale; 
} 

그리고 여기 내 그리기 루틴 여기 내 코드입니다 , 그러나 완전히 퍼지. lineWidth을 가지고 노는 것은 도움이되지 않습니다. lineWidth이 작게 설정되면 더 밝아 지지만 생기있는 것은 아닙니다.

그래서 도메인 좌표를 사용할 수 있도록 좌표계가 조정 된 뷰를 설정하는 방법이 있습니까? 아니면 드로잉 루틴에서 스케일링을 구현해야합니까?

이 문제는 변환이나 회전에는 발생하지 않습니다.

감사

답변

2

음, 자주, 문제가 해결에 나를 인도 설명.

뷰 변형 속성은 비트 버퍼로 그려진 후에 적용됩니다. 스케일링 변환은 그리기 전에 적용되어야합니다. drawRect 방법입니다. 그래서 내가 여기에 준하고, awakeFromNib이 올바른의 drawRect입니다 스크래치 : 내가 얻을

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGAffineTransform scale = CGAffineTransformMakeScale(6.0, 6.0); 
    CGContextConcatCTM(context, scale); 
    CGRect r = CGRectMake(10., 10., 10., 10.); 
    CGFloat lineWidth = 0.1; 
    CGContextStrokeRectWithWidth(context, r, lineWidth); 
} 
+1

스케일 인자에 상관없이 라인 폭을 포인트 단위로 설정하려면 '원하는 포인트/스케일 인자 수'로 설정하십시오. 예 : 기본값은 1pt/1x = 1입니다. 당신의 6X 팩터에서 1pt 라인은'1.0/6.0'입니다; 2-pt 라인은'2.0/6.0'이 될 것입니다. –

10

에서 [쓰다] 사각형이 매우 퍼지이다. 당신은 전체 번호 좌표에 사각형을 그려 당신의 선폭이 포스트 스크립트 1.

때문에

일반적으로이이다 (따라서 그 자손의 : AppKit의, PDF 및 석영) 도형 단위는 기본적으로 점으로, 1 점은 정확히 1/72 인치입니다. Mac 및 iPhone은 현재 화면의 실제 해상도와 상관없이 모든 픽셀을 1 픽셀로 처리하므로 실용적인 점은 기본적으로 Mac 및 iPhone의 픽셀 수와 같습니다.

포스트 스크립트와 그 자손에서 통합 좌표는 점 사이에서 실행됩니다. 예를 들어 0, 0은 왼쪽 아래 지점의 왼쪽 아래 모서리입니다. 1, 0은 같은 점의 오른쪽 아래 모서리 (오른쪽의 다음 점의 왼쪽 아래 모서리)입니다.

스트로크는 스트로크하는 경로의 가운데에 위치합니다. 따라서 반은 경로 안쪽에 있고 반쪽은 외부에 있습니다.맥의 개념 상 72 dpi의 세계에서는

,이 두 가지 사실은 문제를 생산하기 위해 결합합니다. 1pt가 1 픽셀이고 두 픽셀 사이에 1pt 획을 적용하면 획의 절반이 각 픽셀에 도달합니다.

석영은, 적어도, 색상의 알파의 절반에 모두 픽셀로 현재의 색을 그림으로이 렌더링됩니다. 이것은 픽셀의 얼마나 많은 부분이 개념적 스트로크로 덮여 있는지를 결정합니다. 너비 1.5 피트의 선을 사용한 경우, 그 절반은 0.75pt이며, 1pt 픽셀의 4 분의 3이므로 색상은 0.75 알파로 렌더링됩니다. 이것은 당연한 결론입니다. 자연스러운 결론으로 ​​넘어갑니다. 선 두께가 2pt 인 경우 각 픽셀이 완전히 덮여 알파가 1이됩니다.이 효과는 1pt 스트로크에서 볼 수 있으며 2-pt 스트로크.

  • 하프 점 번역 :

    몇 가지 해결 방법이 있습니다 정확히 무엇인지는 상자라고, 당신이 보상까지 번역과 오른쪽 절반 지점에 의해 상기 1-PT-컷에서 - 하프 부문.

    단순한 경우에는 작동하지만 전체 점 변환을 제외한 다른 좌표 변환이 포함 된 경우에는 조각이납니다. 즉, 30, 20까지 번역 할 수 있지만 여전히 작동하지만 33 + 1/3, 25.252525 ...로 번역하면 크기를 조정하거나 전혀 회전하지 않으면 반올림 번역이 쓸모 없게됩니다. .

  • 내부 획 : 먼저 선을 그은 다음 선폭을 두 배로 만듭니다 (절반 만 그리기 때문에).

    다른 드로잉에 영향을주는 클리핑 패스를 원하지 않기 때문에 많은 드로잉이 필요하다면 gstate 저글링이 필요할 수 있습니다.

  • 외부 스트로크 : 클리핑하기 전에 경로를 뒤집어 놓는 것을 제외하고는 기본적으로 내부 스트로크와 같습니다.

    스트로크하려는 경로가 겹치지 않는다면 내부 스트로크보다 좋을 수 있습니다 (덜 gstate 한 저글링). 반면에, 길을 채우고 싶다면 gstate 저글링이 돌아옵니다.

* 이것은 영원히 지속되지 않습니다. 애플은 언젠가 맥의 드로잉 해상도를 적어도 어느 시점에서 바꿀 것이라는 힌트를 잠시 드러내고있다. 이러한 변경을위한 API 토대는 현재 거의 모든 곳에 있습니다. 모든 것이 애플의 전환점이다.

+0

이것은 내가 경험 한 어렴풋한 원인이 아니라는 것을 제외하고는 모두 매우 사실입니다. 퍼지 (fuzziness)는'UIView.transform'이 포스트 블리 팅 단계로 뷰에 적용된다는 사실 때문에 발생합니다. 그래서 여기에서는'drawRect'에 의해 그려진 비트 맵을 확대하고 있습니다. 'drawRect'의 시작 부분에 transform *을 적용하여 간단히 수정합니다. 이것은'UIView.transform'을 스케일링에 쓸모 없게 만듭니다. 물론, 나는 여전히 당신이 묘사하는 것을 보았습니다 - 픽셀 보행. 1 픽셀 수직 및 수평 스트로크에 대한 시각적 인상은 흐릿함이 아닌 검은 색 대신 회색으로 표시됩니다. –

관련 문제