Thay đổi kích thước đa giác dọc theo một trục


8

Sử dụng ví dụ sau tôi có thể thay đổi kích thước theo tỷ lệ và nguồn gốc.

    polygonFeature.geometry.resize(scale, origin);
    vectorLayer.redraw();

Nhưng có ai có bất kỳ đề xuất hoặc mã mẫu nào về cách tôi sẽ thay đổi kích thước một đa giác trên một trong các trục của nó không?

Ví dụ: Tôi muốn thay đổi kích thước đa giác màu cam thành một cái gì đó giống như đa giác màu đỏ. Vì vậy, chỉ có các cạnh phía bắc và phía nam di chuyển trong khi các cạnh phía đông không đổi.

nhập mô tả hình ảnh ở đây

EDIT # 1 Đây là trường hợp sử dụng và dữ liệu ví dụ: Người dùng chỉ muốn một phần của hình chữ nhật màu cam vì anh ta chỉ quan tâm đến đường bờ biển và các nhà cung cấp vệ tinh sẽ tính phí cho anh ta nhiều hơn cho toàn bộ hình ảnh. Người dùng cần chỉ định phần nào của hình ảnh họ muốn đặt hàng.

Mặc dù, tôi không cần toàn bộ giải pháp với tay cầm kích thước tất cả những gì tôi cần là khả năng thay đổi kích thước Chiều cao của đa giác .

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

EDIT # 2: Có lẽ tôi sẽ sai về điều này. Tôi cần một giải pháp javascript (trình duyệt) openlayers và không thể quay lại máy chủ để thay đổi kích thước. Có lẽ những gì tôi nên làm là nội suy các điểm dọc theo các cạnh đông và tây của hình học đa giác (các chấm đen). Sau đó tạo hai dòng (đường màu xanh lá cây) trong đó người dùng có thể kéo nhưng hạn chế chuyển động (kéo) đến các điểm được nội suy đó. Khi người dùng "xong" tôi có nhận được đa giác màu vàng còn lại không?

nhập mô tả hình ảnh ở đây


2
Là đa giác luôn luôn là một hình chữ nhật? Các cạnh có được căn chỉnh tùy ý không, hoặc chúng có tuân theo một số hướng lưới bản đồ của hệ thống tham chiếu tọa độ không?
Mike T

Câu hỏi hay, thực tế nó sẽ luôn là một hình chữ nhật, vì vậy CÓ. Chúng là trắc địa và đó là lý do tại sao các cạnh trên và dưới không giống nhau (hoặc không giống nhau). Chúng là những dải vệ tinh, vì vậy chúng đi khắp toàn cầu, nhưng trong EPSG: 4326 chúng đi lên và xuống theo đường lượn sóng.
CaptDragon

@Mike: xem Chỉnh sửa # 1 để biết thêm chi tiết.
CaptDragon

Những gì bạn đang theo dõi là một sự thay đổi liên quan , ngoại trừ việc tôi không biết rõ về các trình mở để xem nó có hỗ trợ điều này không .. Tôi chắc chắn ai đó có thể bấm nút dẫn đến câu trả lời này
Mike T

Tôi đã thực hiện chuyển đổi affine ... chú ý cách hình ảnh được sắp xếp hợp lý trên bản đồ sang một bên ... tôi thực sự chỉ cần thay đổi kích thước chiều cao của đa giác.
CaptDragon

Câu trả lời:



1

Trong trường hợp chung, tôi sẽ sử dụng một chuyển đổi phối cảnh để chuyển đổi tứ giác ban đầu của bạn thành một hình vuông đơn vị và trở lại.

Các bước cơ bản là:

  1. Tìm ma trận biến đổi affine từ quad của bạn sang ô vuông đơn vị.
  2. Chia tỷ lệ hình vuông đơn vị theo tỷ lệ tương tự người dùng muốn chia tỷ lệ hình tứ giác ban đầu.
  3. Đảo ngược ma trận thu được ở bước 1.
  4. Áp dụng ma trận nghịch đảo đó cho hình vuông bị bẹp để biến nó trở lại không gian bản đồ.

Hãy cẩn thận:

  • Kiểm tra xem bạn có một ma trận hợp lệ và nó không thể đảo ngược.
  • Nó sẽ chỉ hoạt động thành công với các tứ giác lồi.

Đối với công việc bạn đang làm, bạn không nên có bất kỳ trường hợp kỳ lạ nào như đa giác lõm. Tôi không chắc điều gì sẽ xảy ra với các hình tứ giác bao phủ các vùng cực, tôi nghi ngờ trước tiên bạn phải chiếu nó vào một số hình chiếu cực.

Liên kết được đăng ở bước 1. dẫn đến một bài báo nặng về toán học và một số mã nặng mẫu C ++. Nhưng không quá khó để tìm ra cách mã hoạt động vì đó chỉ là một chức năng nhỏ ở đầu tệp .


Cảm ơn ... nhưng tôi thực sự cần một giải pháp javascript openlayers.
CaptDragon

1
Toán học đơn giản và tổng quát hơn nhiều. Để quad có các đỉnh (x0, x1, x2, x3) (theo thứ tự), trong đó bạn muốn sửa bên x0x1. Định cỡ lại nó theo một yếu tố a dọc theo các cạnh x1x2 và x0x3 tạo ra đa giác mới (x0, x1, x2 ', x3') trong đó x2 '= x1 + (x2 - x1) * a và x3' = x0 + (x3 - x0) a. Tốt nhất là làm việc trong các tọa độ dự kiến.
whuber
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.