공간 라인 패턴에 대한 통계 테스트?


32

점이 무작위로 분포되어 있는지 여부를 결정하는 데 사용할 수있는 공간 점 패턴에 대한 많은 테스트가 있지만 공간 선 패턴에 대한 기존 테스트가 있습니까? (시작점과 끝 점이 있고 중간 노드가없는 직선을 생각하고 있습니다.)

내가 분석하고자하는 데이터는 인간과 동물 운동의 OD (origin-destination) 라인입니다. ( 무지향 회선 클러스터링 의 예와 유사합니다 .)

지금까지 한 가지 아이디어는 4D 포인트와 같은 선을 처리하고 포인트 패턴 테스트를 사용하는 것이었지만 이것이 적절한 지 확실하지 않습니다.

이상적인 테스트를 통해 라인 클러스터가 있는지 확인할 수 있습니다.

본능적으로, 나는 같은 출발지에서 시작하지만 모든 종류의 다른 목적지를 가진 많은 노선이 클러스터로 간주되어서는 안된다고 말합니다. 반면에 더 긴 시간 동안 병렬로 연결된 많은 라인은 클러스터가됩니다. 여기에 이미지 설명을 입력하십시오


한 줄이 다른 줄과 평행하지만 1) 첫 번째 줄보다 훨씬 짧거나 2) 첫 번째 줄의 방향으로 "멀리"떨어져있는 경우
어떻게해야합니까

이 경우 @radouxju, 나는 그들이 같은 클러스터에 속하지 않는다고 말하고 싶습니다
어두운 곳

답변:


17

라인 피쳐에 대해 개발 된 공간 프로세스 통계가 많지 않았기 때문에 어려운 질문입니다. 방정식과 코드를 심각하게 파헤 치지 않으면 포인트 프로세스 통계는 선형 특성에 쉽게 적용 할 수 없으므로 통계적으로 유효하지 않습니다. 주어진 패턴이 테스트되는 널 (null)이 임의의 필드에서 선형 종속성이 아닌 포인트 이벤트를 기반으로하기 때문입니다. 나는 강도와 배열 / 배향이 더 어려울 때까지 널이 무엇인지 알지 못한다고 말해야합니다.

나는 단지 여기에서 뱉어 낼 수 있지만 유클리드 거리 (또는 라인이 복잡한 경우 하우스 도프 거리)와 결합 된 라인 밀도의 멀티 스케일 평가가 클러스터링의 지속적인 측정을 나타내지 않을지 궁금합니다. 이 데이터는 길이의 차이를 설명하기 위해 분산을 사용하여 선 벡터에 요약 할 수 있으며 (Thomas 2011) K- 평균과 같은 통계를 사용하여 군집 값을 할당 할 수 있습니다. 클러스터를 지정한 후에는 아니지만 클러스터 값이 클러스터링 수준을 분할 할 수 있음을 알고 있습니다. 이것은 분명히 k의 최적 적합을 요구하므로 임의의 군집은 할당되지 않습니다. 이것이 그래프 이론적 모델에서 엣지 구조를 평가하는 데 흥미로운 접근법이라고 생각합니다.

다음은 R에서 작동하는 예제입니다. 죄송하지만 QGIS 예제를 제공하는 것보다 빠르며 더 재현 가능하며 편안합니다.

spatstat의 라이브러리를 추가하고 구리 psp 객체를 라인 예제로 사용하십시오.

library(spatstat)
library(raster)
library(spatialEco)

data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/2)

표준화 된 1 차 및 2 차 라인 밀도를 계산 한 다음 래스터 클래스 객체로 강제 변환

d1st <- density(l)
  d1st <- d1st / max(d1st)
  d1st <- raster(d1st)  
d2nd <- density(l, sigma = 2)
  d2nd <- d2nd / max(d2nd)
  d2nd <- raster(d2nd)  

스케일 통합 밀도로 1 차 및 2 차 밀도 표준화

d <- d1st + d2nd
d <- d / cellStats(d, stat='max')  

표준화 된 역 유클리드 거리를 계산하고 래스터 클래스로 강제 변환

euclidean <- distmap(l)
euclidean <- euclidean / max(euclidean)
euclidean <- raster.invert(raster(euclidean))

spastera psp를 sp SpatialLinesDataFrame 객체로 강제 변환하여 raster :: extract에 사용합니다.

as.SpatialLines.psp <- local({
     ends2line <- function(x) Line(matrix(x, ncol=2, byrow=TRUE))
     munch <- function(z) { Lines(ends2line(as.numeric(z[1:4])), ID=z[5]) }
     convert <- function(x) {
        ends <- as.data.frame(x)[,1:4]
        ends[,5] <- row.names(ends)
        y <- apply(ends, 1, munch)
        SpatialLines(y)
     }
     convert
})
l <- as.SpatialLines.psp(l)
l <- SpatialLinesDataFrame(l, data.frame(ID=1:length(l)) )

결과 플롯

par(mfrow=c(2,2))
  plot(d1st, main="1st order line density")
    plot(l, add=TRUE)
  plot(d2nd, main="2nd order line density")
    plot(l, add=TRUE) 
  plot(d, main="integrated line density")
    plot(l, add=TRUE)   
  plot(euclidean, main="euclidean distance")
    plot(l, add=TRUE) 

래스터 값을 추출하고 각 라인과 관련된 요약 통계를 계산

l.dist <- extract(euclidean, l)
l.den <- extract(d, l)
l.stats <- data.frame(min.dist = unlist(lapply(l.dist, min)),
                      med.dist = unlist(lapply(l.dist, median)),
                      max.dist = unlist(lapply(l.dist, max)),
                      var.dist = unlist(lapply(l.dist, var)),
                      min.den = unlist(lapply(l.den, min)),
                      med.den = unlist(lapply(l.den, median)),
                      max.den = unlist(lapply(l.den, max)),
                      var.den = unlist(lapply(l.den, var)))

최적의 k 함수를 사용하여 클러스터 실루엣 값을 사용하여 최적의 k (클러스터 수)를 평가 한 다음 선에 클러스터 값을 지정하십시오. 그런 다음 각 클러스터에 색상을 할당하고 밀도 래스터 위에 플롯 할 수 있습니다.

clust <- optimal.k(scale(l.stats), nk = 10, plot = TRUE)                      
  l@data <- data.frame(l@data, cluster = clust$clustering) 

kcol <- ifelse(clust$clustering == 1, "red", "blue")
plot(d)
  plot(l, col=kcol, add=TRUE)

이 시점에서, 결과 강도 및 거리가 무작위로부터 중요한지 테스트하기 위해 라인의 무작위 화를 수행 할 수있다. "rshift.psp"함수를 사용하여 선의 방향을 임의로 조정할 수 있습니다. 시작 및 중지 지점을 무작위로 지정하고 각 줄을 다시 만들 수도 있습니다.

또한 선의 변하지 않는 시작점과 정지 점에 대해 일 변량 또는 교차 분석 통계를 사용하여 점 패턴 분석을 수행 한 경우 "무엇"인지 궁금합니다. 일 변량 분석에서는 시작점과 종료점의 결과를 비교하여 두 점 패턴간에 군집화의 일관성이 있는지 확인합니다. 이 작업은 f-hat, G-hat 또는 Ripley's-K-hat (표시되지 않은 포인트 프로세스)을 통해 수행 할 수 있습니다. 다른 접근법은 2 점 프로세스가 [시작, 중지]로 표시되어 동시에 테스트되는 교차 분석 (예 : 교차 -K)입니다. 이는 클러스터링 프로세스에서 시작 지점과 중지 지점 사이의 거리 관계를 나타냅니다. 하나, 기본 강도 프로세스에 대한 공간 의존성 (nonstaionarity)은 이러한 유형의 모델에서 불균일하게 만들고 다른 모델을 요구하는 문제가 될 수 있습니다. 아이러니하게도, 불균일 한 프로세스는 강도 함수를 사용하여 모델링되어 전체 원을 밀도로 되돌려 스케일 통합 밀도를 클러스터링의 척도로 사용하는 아이디어를 지원합니다.

다음은 선 피쳐 클래스의 시작, 중지 위치를 사용하여 표시되지 않은 포인트 프로세스의 자동 상관에 대한 Ripleys K (Besags L) 통계의 빠른 작동 예입니다. 마지막 모델은 공칭 표시 프로세스로 시작 및 중지 위치를 모두 사용하는 크로스 k입니다.

library(spatstat)
  data(copper)
  l <- copper$Lines
  l <- rotate.psp(l, pi/2)

Lr <- function (...) {
 K <- Kest(...)
  nama <- colnames(K)
   K <- K[, !(nama %in% c("rip", "ls"))]
   L <- eval.fv(sqrt(K/pi)-bw)
  L <- rebadge.fv(L, substitute(L(r), NULL), "L")
 return(L)
}

### Ripley's K ( Besag L(r) ) for start locations
start <- endpoints.psp(l, which="first")
marks(start) <- factor("start")
W <- start$window
area <- area.owin(W)
lambda <- start$n / area
 ripley <- min(diff(W$xrange), diff(W$yrange))/4
   rlarge <- sqrt(1000/(pi * lambda))
     rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )

### Ripley's K ( Besag L(r) ) for end locations
stop <- endpoints.psp(l, which="second")
  marks(stop) <- factor("stop")
W <- stop$window
area <- area.owin(W)
lambda <- stop$n / area
 ripley <- min(diff(W$xrange), diff(W$yrange))/4
   rlarge <- sqrt(1000/(pi * lambda))
     rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )

### Ripley's Cross-K ( Besag L(r) ) for start/stop
sdata.ppp <- superimpose(start, stop)
( Lenv <- plot(envelope(sdata.ppp, fun="Kcross", r=bw, i="start", j="stop", nsim=199,nrank=5, 
                 transform=expression(sqrt(./pi)-bw), global=TRUE) ) )

참고 문헌

Thomas JCR (2011) 프로토 타입으로 라인 세그먼트를 사용하는 K- 평균을 기반으로하는 새로운 클러스터링 알고리즘. 에서 : San Martin C., Kim SW. (eds) 패턴 인식, 이미지 분석, 컴퓨터 비전 및 응용 프로그램의 진행. CIARP 2011. 컴퓨터 과학 강의 노트, vol 7042. Springer, Berlin, Heidelberg


14

당신은 Fréchet 거리 를보고 싶을 수도 있습니다 . 나는 최근 에 파이썬 구현을 찾고 있는 최근 질문 후에 이것에 대해 알게되었습니다 .

이것은 선 스트링의 공간적 유사성 을 찾기위한 메트릭입니다 . 다각형 유사성 측정과 동일하지만 방향이있는 선 스트링에 해당하는 Hausdorff 거리와 유사한 아이디어입니다.

Fréchet 거리는 한 궤적의 개와 두 번째 궤적의 소유자를 연결하는 가죽 끈의 최소 길이로 정의됩니다.

이 지표는 두 개의 곡선에 대해 작은 값을 가지는데,이 곡선은 서로 가깝게 위치하며 거의 평행하며 같은 방식으로 정렬되며 길이는 비슷합니다.

그러나 클러스터 식별 부분에는 대답하지 않습니다.

여기에 포괄적 인 프레젠테이션이 있습니다 . 귀하의 상황은 46-49 절에서 언급 된 일부 유스 케이스처럼 들립니다.

이 측정 항목은 다음과 같은 비 지리적 사용이 많습니다.

  • 유전자 시퀀싱에서 공통 서브 패턴 탐지
  • 필기 인식
  • 주가 이력과 같은 시계열의 상관 기간 감지

참고 문헌의 많은 논문이이 주제를 다루고 있지만 대부분은 지리 공간이 아닙니다. 또한 이들 논문의 대부분은 지리 공간 / 지구과학보다는 알고리즘 / 수학 / 컴퓨터 과학에 속하며 그에 따라 목표가 설정됩니다.

그러나이 논문은 유망한 것으로 보였다 :-

Buchin, K., Buchin, M. 및 Wang, Y. (2009). Fréchet 거리를 통한 부분 곡선 매칭을위한 정확한 알고리즘. 이산 알고리즘에 관한 제 20 회 ACM-SIAM 심포지엄 진행, 645–654 페이지

다른 논문들 중 일부는 클러스터 식별 및 클러스터에 궤적 할당과 같은 의도에 더 가깝게 들리지만 시계열 데이터 또는 기타 비 지형 공간적 예를 사용하여 설명됩니다. 그러나 그들은 흥미로운 방향을 가리킬 수 있습니다.


2
유클리드 거리 대신 Frechet 또는 Hausdorff 거리를 사용하는 최소 연계 (또는 DBSCAN) 클러스터링이 좋은 솔루션이라고 생각합니다.
dbaston

나는 Frechet 거리가 존재한다는 것을 좋아하고 프레젠테이션이 "젤리 빈"과 "벨리 버튼"을 비교하는 것을 좋아합니다.
Fezter

5

여기에 설명 된 것과 비슷한 접근 방식을 사용하는 것이 좋습니다 .

알고리즘 및 명명 :

a) 네임 라인 레이어 NODES. 컴퓨팅 베어링

b) 거리 공차를 사용하여 (1 대 다수) 공간적으로 결합합니다. 네임 레이어 LINKS

c) LINKS 조인 자체 (예 : NAME = NAME_1)에서 삭제

d) LINKS 내부에서 "동일한"방향 쌍을 찾습니다. 나는 사용했다 :

def theSame(aList,tol):
    maxB=max(aList);minB=min(aList)
    if abs(maxB-minB)<tol:return 1
    if abs(maxB-minB-180)<tol:return 1
    return 0
#-----------
theSame( [!BEARING!, !BEARING_1!],15)

즉 반대 방향으로가는 선은 방향면에서 비슷하다고 가정

d) LINKS에서 유사하지 않은 (0) 쌍을 제거하십시오.

e) NODES를 통해 연결된 LINKS 그룹을 계산하고 그룹 번호를 NODES 테이블로 전송합니다.

여기에 이미지 설명을 입력하십시오

운수 나쁘게:

여기에 이미지 설명을 입력하십시오

그러나 그룹 내 베어링의 간단한 통계, 예 : 표준 편차 :

abs(tan(bearing))

첫 번째 경우에는 편차가없고 두 번째 경우에는 매우 큰 차이가있었습니다. 마찬가지로 길이 통계는 '오랫동안 병렬로 실행'하는 데 도움이 될 수 있습니다.

위의 관심사가 있다면 연결된 링크 그룹을 계산하는 스크립트로 답변을 업데이트 할 수 있습니다. arcpy 및 networkx 모듈을 사용하고 있습니다.

같은 지점에서가는 선 쌍을 반대 방향으로 처리하는 방법을 모른다 ...


스크립트를 보는 데 관심이 있습니다.
alphabetasoup

1
@RichardLaw는 내 솔루션의 첫 번째 라인에있는 링크를 따라 아래로 스크롤하여 확인하십시오. 약간 더 세련된 버전이 있지만 그렇게 할 것입니다. 논리는 매우 간단합니다. 1. 링크와 연결된 노드를 사용하여 그래프를 만듭니다. 2. 첫 번째 노드를 가져와 조상 (그룹 0)을 찾습니다. 3) 그래프에서 노드를 제거하고 노드가 남지 않을 때까지 반복합니다. 고품질 Council / LINZ 데이터 세트에 대해 분리 된 파이프 그룹 (스트림 및 기타) 등을 찾기 위해 반복적으로 사용합니다.
FelixIP

5

내 눈에는 라인의 정의에 문제가 있는데, 하나는 어떤 접근법을 사용 해야하는지 결정할 것입니다 (위에서 언급 한 것 중 일부). 이것들이 OD 쌍이고 지오메트리가 역할을하지 않으면 네트워크 클러스터링을 기반으로 이것에 접근합니다. 네트워크가 네트워크를 형성하지 않는다고 말하십시오. 그러나 출발지와 목적지가 의미있는 지역에 속할 가능성이 있으므로 네트워크로 취급 할 수 있습니다.

지오메트리가 할 말이있는 경우 (GPS 궤도, 지오메트리를 고려하려는 경우) 실제로 (x, y, t) 공간에서 작업해야합니다. 시간은 같은 것으로 평가되지 않을 수 있습니다-이것은 질문에 명시되어 있지 않습니다.

당신이 볼 수있는 몇 가지 가능성 :

  1. 가장 필요한 것은 Dodge, Weibel, Forootan (2009)입니다. http://orca.cf.ac.uk/94865/1/PhysicsMovement.pdf
  2. 형상을 단순화 할 수있는 경우 여기에 언급 된 매개 변수를 사용할 수 있습니다. http://www.tandfonline.com/doi/full/10.1080/17445647.2017.1313788

그러나 마지막으로 첫 번째 질문을 다시 한 번 더 읽으면 더 간단 할 수 있습니다. 세그먼트의 선형 확장과 가장 가까운 점의 교차점 사이의 거리를 쌍으로 (세그먼트 간) 계산할 수 있습니까? 어쩌면 길이에 따라 세그먼트 자체) 및 매트릭스 클러스터링 알고리즘을 사용합니까? 추론 : 멀리 교차하는 세그먼트는 서로 교차하는 세그먼트보다 유사합니다 (병렬). 도면에서 오프셋에있는 동일 선상 또는 평행 선분을 처리하는 방법을 설명하지 않습니다 (긴 주둥이 거리). 위의 해결책에 문제가 있다고 가정합니다. (위의 "선형 확장"을 명시 적으로 명시하여 명확성을 위해 편집)

참고 (2018 년 1 월) : 최근에 이것을 우연히 발견했습니다.

  1. Cai, Yuhan 및 Raymond Ng. "체비 쇼프 다항식으로 시공간 궤적을 인덱싱합니다." 2004 년 ACM SIGMOD 국제 데이터 관리 회의 진행 ACM, 2004.

궤적 유사성과 관련되어 어느 정도 유사성을 정량화 할 수 있습니다. 이것은 커브의 다항식 근사와 체비 쇼프 거리 계산에 기반합니다.


4

작업중인 데이터 유형에 대해 좀 더 자세히 설명해 주시겠습니까? 이것들은 일련의 분리 된 선입니까, 아니면 네트워크를 형성합니까? 공간 패턴 분석에 ArcGIS 도구를 사용해 보셨습니까? 많은 ArcGIS 방법 (Ripley 's K, NN index, Morans I)은 비점 데이터에 사용될 때 선 / 다각형의 중심을 사용합니다. 그러나 여기서는 중심선이 매우 멀리 떨어져있어서 고려되지 않는 매우 긴 선을 피하기 위해 각 선을 동일한 섹션으로 나누는 것을 고려해야합니다.

고려해야 할 또 다른 것은 개념적으로 선 클러스터가 무엇입니까? 서로 가까이에서 시작하는 많은 선이있을 수 있지만 끝 점이 분산 될 수 있습니다. 마찬가지로 서로 가까이에서 시작하고 끝나는 많은 선을 얻을 수 있지만 시작 / 끝 지점 사이에 매우 분산되어 있습니다.

그러나 한 가지 방법은 단순히 라인 밀도 분석을 수행하여 더 많은 라인이있는 영역 (어떤 의미에서 클러스터 된 것으로 간주 될 수 있음)은 높은 그리드 값을 가지지 만 밀도가 낮은 영역은 낮은 값을 갖습니다. 따라서 약간의 핫스팟 출력을 얻습니다. 그러나 이것은 Morans I 또는 NNI와 같은 단일 통계를 제공하지 않습니다. 또한 하나의 불규칙한 선 (즉, 단단한 나선)과 여러 선의 결과로 밀도를 구분하지 않습니다.

죄송합니다.이 문제에 대한 완전한 답변은 아니지만 달성하려는 목표에 대한 전체 개념을 이해하면 더 나은 솔루션을 제공 할 수 있다고 생각합니다.

최신 정보

당신이 준 예제를 기반으로 필자는 포인트 패턴 측정에 사용할 선 베어링 속성을 가진 포인트를 생성하는 FelixlP의 제안이 좋은 방법이라고 생각합니다. 점을 동일한 세그먼트로 나누고 각 선 정점에서 선 베어링이있는 점을 제외하고. 그런 다음 각 점의 근접성과 베어링 간의 유사성을 살펴볼 측정 값을 살펴볼 필요가 있습니다 (따라서 수직에 더 가까운 선을 감지합니다).

따라서 Getis-Ord GI (Hotspot 분석)를 사용하면 클러스터의 위치를 ​​시각화하는 데 유용한 도구가됩니다. 그리고 전 세계 수준의 클러스터링을 평가하는 전 세계 모란의 I.

그러나 선을 분할하는 거리는 발견 된 군집 정도에 영향을줍니다. 1km 규모의 클러스터를 찾고 있다면 선을 그 주위로 분할해야합니다. 마찬가지로 100m 규모의 클러스터를 찾는 경우 그에 따라 선을 세그먼트 화해야합니다. 따라서 줄을 놓치지 않고 각 줄을 클러스터로 감지하지 못합니다.


선은 여행 출발지와 목적지를 나타냅니다. 그들은 네트워크를 형성하지 않습니다. 지금까지 원점과 대상 점의 공간 점 패턴에 R 방법을 사용했습니다. 나는 라인 중심을 사용한다는 아이디어를 좋아하지는 않지만 라인을 고밀도화하고 결과 노드를 분석하는 것이 좋습니다. 감사합니다!
underdark

더 적합한 것을 찾지 못하면 라인 밀도 분석이 대체 솔루션이 될 수 있습니다.
underdark

기본 라인을 특정 거리만큼 버퍼링 한 다음 버퍼로 완전히 둘러싸이지 않은 라인을 쿼리하는 것이 해결책입니까? 과거에 가장 가능성이 높은 이동 경로를 찾기 위해이 작업을 많이 수행했지만 데이터는 단순한 선 세그먼트가 아닌 다중 노드 폴리선으로 구성되었습니다.
jbgramm

@jbgramm 뭔가를 계산 할 많은 방법을 생각할 수 있지만 통계가 아닌 그리고 난 따라서 정해진 방법을 찾고 있어요 - 어떤 존재하는 경우
언더 다크

2
점 중심점 또는 정점을 사용하여 점 프로세스를 나타내는 것은 통계적으로 유효한 방법이 아닙니다. 게다가, 당신은 공간 과정의 표현을 크게 바꾸고 있습니다. 나는 약간의 권장 사항을 게시하지만 솔직히 다소 유효한 접근 방식을 제공 한 유일한 방법은 선 밀도의 @underdark 제안입니다. 자기 상관 통계량과 결합 된 스케일에서 선형 기능의 클러스터링 정도를 나타냅니다.
Jeffrey Evans

3

예제 주셔서 감사합니다.

찾고있는 것을 계산하는 확립 된 방법을 보지 못했지만 이것이 내 접근 방식입니다. 일종의 무차별 대입 솔루션입니다.

최소 경계 사각형을 계산 한 다음 임의의 크기로 확장하지만 네 모서리에서 각각 같은 양을 확장하십시오.

직사각형 생성의 질량 중심을 찾고 각 선의 OD 점에 대한 방위각 및 거리 분포를 계산 한 후 경계 직사각형의 모서리를 사용하여 선의 방위각을 비교하여 동일하게 수행하십시오.

네 모서리에서 각각의 광선 끝까지 평 행성을 테스트합니다. 질량 중심에서 각 광선의 끝까지 평 행성을 테스트합니다.

이렇게하면 모서리와 끝의 편차를 비교할 수 있습니다. 예 (a)에서는 두 모서리에서 세 개의 선 클러스터까지 거의 평행 한 선이 있습니다. 또한 질량 중심에서 선의 끝까지 거의 평행선을 갖습니다.

예 (b) 모서리에서 각 선의 끝까지 계산할 때 거의 평행선이 없지만 선이 무작위처럼 보이지 않고 약간의 편차를 가지고 서로 이어집니다.

예 (c)는 무작위로 보입니다

예 (d)는 무작위가 아니며 방사형입니다.

이것을 자세히 살펴보면 위에서 설명한 테스트를 실행하고 생성 된 둘러싸는 사각형의 모서리에서 광선의 끝까지 삼각형 솔루션 테스트를 만듭니다. 클러스터의 선 중 하나가 다른 선보다 상당히 짧지 않으면 비슷한 내부 각도 및 영역이 군집을 확인하는 데 도움이됩니다.

위의 바보의 의견 중 하나이며, 아마 틀렸을 것입니다.


-1

본능적 인 설명에 따라 두 줄이 평행을 이루는 기준은 무엇입니까?

기본적으로 시작점 또는 종료점에 대해 테스트를 수행 할 수 있습니다.
Sx = (start_x_line_1-start_x_line_2),
Sy = (start_y_line_1-start_y_line_2)
및 Ex, Ey는 동일하지만 끝점에 대해 테스트 할 수 있습니다 .

따라서 sqrt (Sx² + Sy²) 및 sqrt (Ex² + Ey²)가 특정 임계 값보다 낮 으면 이러한 선을 병렬로 간주 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.