2009-10-19 2 views
2

카이로를 사용하여 임의의 텍스트를 임의의 위치에 배치하고 이전에 그린 임의의 모양과 겹치는 지 알아야합니다. 이전 드로잉에 대한 경로를 클립 할 수 있고 클리핑이 발생하면 겹치는 부분이 있음을 의미합니다. 그러나 카이로는 클리핑이 발생했는지 여부를 알 수있는 기능이없는 것으로 보입니다.카이로 테스트에서 텍스트가 겹치는 경우

내가 원하는 것을 쉽게 달성 할 수있는 방법이 있습니까? 나는 기본적으로 두 모양이 교차하는지 아닌지보기를 원한다고 생각합니다.

답변

1

대신 Qt를 사용하여이 문제를 해결했습니다. 그것은 다른 경로 운영에 대해 상당히 광범위한 지원을하는 것으로 보이며 PDF 및 SVG 출력을 모두 지원합니다.

2

아무 것도 보이지 않습니다. 적어도 단순한 것은 없습니다. 아무 것도 없다면 놀라지 않을 것입니다. 카이로는 교차 테스트가 아닌 벡터 드로잉 작업을 래스터 화하는 것을 목표로합니다. 나는 텍스트의 두 가지가 중복되는지 확인하려고한다면

그러나, 여기에 내가 무엇을 할 것이라고입니다 :

  1. 내 테스트 환경에 적합한 카이로 백엔드를 선택 - 예를 들어, Xlib 등 - 이고 이 픽셀 단위로 분석을 수행하는 데 사용할 수있는 오프 스크린 표면을 사용하십시오.
  2. 첫 번째 텍스트를 100 % 알파가 포함 된 파란색으로 그립니다.
  3. 두 번째 텍스트를 빨간색으로 단색으로 50 % 알파로 그립니다.
  4. 빨간색과 파란색이 모두 0이 아닌 픽셀을 표면을 스캔합니다.

다소 힘이 들지만 안티 앨리어싱에도 대응할 수 있습니다. 나는 간접적으로 카이로를 사용하는 X에서 GTK를 사용하기 전에 (다른 목적으로) 그런 것을했습니다.

그런 식으로하고 싶지 않고 Cairo가 API를 제공하지 않으면 추가 할 수 있습니다. 그것은 아마도 어려울 것이다. 그렇게하기 전에 칼 워쓰와 이야기하고 싶을 수도 있습니다.

+0

카이로에서 교차로 확인 코드가 많이 있습니다. 클리핑에 관한 것입니다. 맞습니까? 코드가 분명히 있습니다. 단지 사용자에게 노출되지 않습니다. 내가 제안한 것처럼 래스터 기반의 해결 방법을 사용할 것입니다.하지만 여전히 약간 바보 같습니다. 아, 카이로는 래스터 화를 목표로하지 않고 벡터 형식을 출력합니다. 나는 카이로가 벡터 기반 드로잉 라이브러리라고 말하고 간단한 작업을 수행하기 위해 래스터 이미지를 사용해야하는 것은 어리석은 것처럼 보입니다. – pafcu

+0

pafcu, 나는 래스터 이미지 경로가 우아하지 않다는 것에 동의한다. 그러나 요구 사항에 따라 구현이 더 빠르면 실행 가능하지만 단순하지 않은 솔루션이 더 바람직합니다. 때로는 하드 드라이브를 폐기해야하고 민감한 데이터를 읽을 수 없도록해야합니다. 우아하지만 시간 소모적 인 접근 방식은 무작위 데이터로 7 배 또는 35 배 재 작성입니다. 대신, 나는 단지 콘크리트 테라스에 가져 가서 썰매 망치 나 곡괭이로 몇 번 쳤습니다. –

+0

Bob, Cairo API가 픽셀 단위로 반복을 제공한다는 사실을 알려 주시기 바랍니다. 나는 거기에있는 기억을 가지고 있지만 그것을 발견 할 수 없었다. 추가 : it 's cairo_image_surface_get_data() – akauppi

3

당신이 싶어 질에 따라 경계 상자에 cairo_stroke_extents, cairo_fill_extentscairo_text_extents 작업을 사용할 수 있습니다.

더 나은 방법은 텍스트의 경계 상자 만 계산하고 마지막 경로에 대해 네 개의 모서리를 cairo_in_fill 또는 cairo_in_stroke으로 확인하는 것입니다. 최대 오류는 단일 글리프 모양에서 테두리 상자까지의 거리가되지만 어쩌면이 정도면 충분합니다.

마지막 옵션은 텍스트를 병합하고 이전 단계 에서처럼 단일 점을 확인하는 것입니다.

+0

귀하의 제안이 그렇게 정확하지 않습니다. 그러나 cairo_in_stroke를 가리켜 주셔서 감사합니다. 텍스트 경계 상자의 크기와 일치하도록 획의 너비를 조정하여 적절하고 빠르고 견고한 메커니즘을 만들 수 있습니다. 이에 대한 내 대답은 아래를 참조하십시오. 그리고 포인터에 감사드립니다. :) – akauppi

0

나는 거의 동일한 상황을 가지고 있으며이를 수행 할 방법이 있다고 생각합니다.

내 문제는 텍스트 바운딩 박스가 표면에 그려진 복잡한 선들 (아마 부드럽게 만들어 졌음)과 교차하는지 여부를 찾는 것입니다. 이것은 현재 병목 현상이며 신속한 교차로 처리로 sw가 아마 100x 속도를 낼 것입니다. 누가 알아.

어쨌든 ntd의 언급 덕분에 cairo_in_stroke이 문제를 해결하기 시작했습니다. 여기에 문제가 있습니다.자체 cairo_in_stroke

만 알려

"주어진 점은 전류 경로와 쓰 파라미터 주어진 cairo_stroke() 동작에 의해 영향을받을 영역 내에 있는지 여부" 이것은 꽤 쓸모가 없다. 경로 폭이 일시적으로 너무 넓어서 경로가 영역을 얻기 시작하지 않는 한.

  1. 세트 라인은 경계 상자의 절반 폭과 높이가 중심
  2. 에 도달 할 때까지, 양쪽의 경계 상자로, 배, ...을
  3. 시험 위치의 X를 (의이 X를 부르 자)

테스트 된 영역은 바운딩 박스가 아니며이를 근사하는 원 체인이 겹쳐져 있습니다. 안전면을 원한다면 선 너비를 추가하면 바운딩 박스가 실제로 만지지 않게됩니다.

실제로이 트릭을 수행하는 방법을 알게되면보고 할 것입니다.