2010-08-21 48 views
28

Giả sử tôi có (x, y) luôn giống với điểm bắt đầu của một dòng và (x, y) thay đổi cho điểm cuối của cùng một dòng hàng. Dòng này cũng luôn dài 40px. Khi bắt đầu chương trình, dòng xuất phát theo hướng dọc (cho phép gọi 0 độ). Dựa trên đầu vào của người dùng, tôi cần dòng để vẽ lại một số độ cụ thể từ nguồn gốc của nó bằng cách chỉ thay đổi kết thúc (x, y). THỰC PHẨMVẽ một đường ở một góc cụ thể trong Java

MỘT SỐ THÊM CHO SUY NGHĨ NẾU BẠN CẦN CNTT:

tôi trong một rut cố gắng để tính toán này và làm cho nó làm việc trong Java. Tôi có thể làm cho công việc toán học tính toán điểm dựa trên chiều dài vòng cung của một đoạn đường tròn, nhưng tôi không biết cách làm cho Java làm điều đó.

Tôi nghĩ rằng nó sẽ làm việc dễ dàng hơn dựa trên góc tam giác vì tôi sẽ luôn biết chiều dài của hai cạnh của tam giác (một bên được tạo thành bởi đường dài 40px và mặt bên kia được hình thành bởi điểm bắt đầu của dòng đó và biên giới của JPanel) và góc hai dòng đó hình thành. Tuy nhiên, bộ não của tôi là mush từ cố gắng để con số nó ra. Bất kì sự trợ giúp nào đều được đánh giá cao.

UPDATE:

@casablanca đã cho tôi đi đúng hướng. Tôi đã đánh thức các chức năng của mình và đây là cách tôi làm cho nó hoạt động.

Trước hết, tôi đã không nhận ra rằng 90 độ đã thẳng lên, nhưng một khi tôi đã nhận ra rằng tôi đã thực hiện giải pháp của tôi phản ánh thực tế đó. Tôi đang vẽ đường của tôi bắt đầu từ trung tâm dưới cùng của khung hình đi ra ngoài. Vì mặt của tam giác nằm ở bên phải của màn hình khi góc của người dùng của tôi dưới 90 độ và nằm ở bên trái màn hình khi góc của người dùng của tôi lớn hơn 90 độ, tôi đã có để điều chỉnh công thức tính đến thực tế đó, vì vậy tôi có bốn phương pháp, một cho phối hợp x ở phía bên trái của màn hình (khi góc cho người dùng lớn hơn 90 độ), một cho phối hợp y ở bên trái của màn hình (khi người dùng cho góc lớn hơn 90 độ) và điều tương tự cho phía bên phải của màn hình khi người dùng đưa ra góc nhỏ hơn 90 độ. Các int length trong tất cả các phương pháp là chiều dài của cạnh huyền. Cảm ơn bạn lần nữa vì đã giúp đỡ @casablanca!

public double leftSideX(double angle, int length){ 
    double x = frameWidth/2 - (length * Math.cos(Math.toRadians(90-(Math.toDegrees(angle)-90)))); 
    return x; 
} 

public double leftSideY(double angle, int length){ 
    double y = frameHeight - (length * Math.sin(Math.toRadians(90-(Math.toDegrees(angle)-90)))); 
    return y; 
} 

public double rightSideX(double angle, int length){ 
    double x = frameWidth/2 + (length * Math.cos(angle)); 
    return x; 
} 

public double rightSideY(double angle, int length){ 
    double y = frameHeight - (length * Math.sin(angle)); 
    return y; 
} 
+0

Cũng xem xét thay đổi bối cảnh của đồ họa biến đổi, đưa ra ở đây: http://stackoverflow.com/questions/3420651 – trashgod

+0

Bạn có thể muốn xem xét việc đóng gói này functionlity trong một lớp; ví dụ. Vector2D. Bằng cách đó bạn có thể xây dựng một Vector2D với toạ độ x và y hoặc chiều dài và góc, và cung cấp các phương thức như getMagnitude(), getAngle(), getX(), getY(), rotateClockwise (double), v.v. – Adamski

+0

Tôi sẽ thích, nhưng tôi nghĩ rằng đó là một chút vượt quá khả năng của tôi ngay bây giờ. Nó đã cho tôi gần một ngày để tìm ra điều này :) – ubiquibacon

Trả lời

64

Đây có phải là những gì bạn đang tìm kiếm không?

startX = x; 
startY = y; 
endX = x + 40 * Math.sin(angle); 
endY = y + 40 * Math.cos(angle); 

Và vẽ một đường từ (startX, startY) đến (endX, endY) trong bất kỳ API nào bạn đang sử dụng.

Cũng lưu ý rằng angle bằng radian. Nếu bạn đã có nó theo độ, bạn cần phải chuyển đổi nó lần đầu tiên:

angle = angle * Math.PI/180; 
+1

Tôi hy vọng Thiên Chúa nó không phải là đơn giản, nhưng nếu nó là bạn sẽ nhận được ở bánh trái cây Giáng sinh này! Tôi quá mệt mỏi để thử nó ngay bây giờ, nhưng điều đầu tiên vào buổi sáng ... cảm ơn cho trả lời nhanh chóng! – ubiquibacon

+1

@Jim Lewis: Trên thực tế, quy ước trig là một cách khác. Tôi chuyển nó bởi vì OP muốn 0 độ là dọc: 'sin 0 = 0' vì vậy' endX = x' và 'cos 0 = 1' vì vậy' endY = y + 40'. – casablanca

+0

@casablanca: D'oh! Tất nhiên bạn nói đúng ... có lẽ tôi nên bỏ bình luận về các bài viết toán học vào tối thứ Sáu. –

Các vấn đề liên quan