2013-08-26 45 views
5

Tôi muốn hỏi xem có mã hay không. .Tìm các đỉnh trong lưới tam giác đều bắt nguồn từ một đỉnh trung tâm

Tôi muốn chỉ định một điểm trung tâm mà từ đó một lưới tam giác đều được tạo ra và nhận được các điểm đỉnh của các tam giác này. Điểm trung tâm không nên là một trung tâm mặt, mà là một đỉnh chính nó. Một đầu vào tiếp theo sẽ là kích thước của hình tam giác (tức là chiều dài cạnh) và bán kính mà các đỉnh tam giác được tạo ra.

Lý do đằng sau nó là tôi muốn tạo một lưới nằm ở giữa trên màn hình/cửa sổ ở giữa với ít mã nhất có thể. Tôi chỉ tìm thấy mã thế hệ lưới, nhưng không phải là một ví dụ "lan truyền hướng tâm".

Cuối cùng, tôi muốn có các đỉnh xa hơn sau đó được di dời theo kiểu logarit, nhưng tôi đoán đó chỉ là một bổ sung dễ dàng khi mã lưới ở đó.

Ai đó có thể giúp tôi với điều đó không? Cảm ơn!

+0

bạn có thể miêu tả "xuyên tâm công tác tuyên truyền hướng ngoại" nhiều hơn một chút? Tôi có thể nghĩ nhiều hơn một cách sẽ xảy ra. – asimes

Trả lời

1

Bạn cần chỉ định hai thứ, bán kính và hướng mà điểm tam giác đầu tiên trỏ tới.

  • Bán kính sẽ là khoảng cách từ điểm ban đầu đến đỉnh của hình tam giác đầu tiên. Tất cả các hình tam giác sẽ có cùng bán kính.
  • Hướng là một số đặc điểm kỹ thuật theo radian. Tôi sẽ giả định rằng 0 có nghĩa là trỏ sang bên phải (PI sẽ là điểm bên trái).

Tìm các đỉnh của tam giác đầu tiên có thể được thực hiện như thế này (pseudo-code, không phải ngôn ngữ cụ thể):

float theta = 0; // The direction, 0 means pointing to the right 
float thetaInc = TWO_PI/3; // 3 because you want a triangle 
for (int i = 0; i < 3; i++) { 
    vertX[i] = initialPointX+cos(theta)*radius; 
    vertY[i] = initialPointY+sin(theta)*radius; 
    theta += thetaInc; 
} 

Có rất nhiều cách để tìm kiếm các điểm trung tâm của tam giác lân cận. Một cách là sử dụng cùng mã nhưng khởi tạo theta = TWO_PI/6, thay thế radius bằng foo (xem toán bên dưới), gán điểm trung tâm mới của hình tam giác lân cận trong vòng lặp, và sau đó sử dụng cùng mã với hướng xoay thích hợp (theta += PI) tìm các đỉnh của những hình tam giác đó.

Khoảng cách từ một trung tâm tam giác khác chỉ biết radius:

  • cạnh huyền = sqrt(sq(radius)+sq(radius));
  • halfHypotenuse = hypotenuse/2.0;
  • lý Pythagore để tìm khoảng cách từ trung tâm của tam giác đến trung tâm của một cạnh: foo = sqrt(sq(radius)-sq(halfHypotenuse));
  • Khoảng cách cuối cùng = foo*2.0;

Mã để tìm ra điểm trung tâm của tam giác lân cận:

float[] nx = new float[3]; 
float[] ny = new float[3]; 

float theta = TWO_PI/6; 
float hyp = sqrt(sq(radius)+sq(radius)); 
float halfHyp = hyp/2.0; 
float foo = sqrt((sq(radius)-sq(halfHyp)))*2.0; 
for (int i = 0; i < 3; i++) { 
    nx[i] = initialPointX+cos(theta)*foo; 
    ny[i] = initialPointY+sin(theta)*foo; 
    theta += thetaInc; 
} 
0

Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Tôi sẽ chơi xung quanh với mã của bạn - phần tuyên truyền sẽ có ích cho chắc chắn.

Trong khi chờ đợi, tôi đã chơi xung quanh với hình lục giác thay vì hình tam giác và mã này hoạt động khá ổn cho cùng một mục đích.:

// cư mảng từ hex trung tâm, đi ra ngoài số lượng mong muốn của vòng hex

  for (int i = 0; i < numberOfHexagonRings; i++) 
      { 
       for (double j = -i; j <= i; j++) 
        for (double k = -i; k <= i; k++) 
         for (double l = -i; l <= i; l++) 
          if ((Math.Abs(j) + Math.Abs(k) + Math.Abs(l) == i * 2) && (j + k + l == 0)) 
          { 
           positionX = (int)(screenCenterX + ((double)sideLength * (l/2 + j))); 
           positionY = (int)(screenCenterY + (3/2 * ((double)sideLength/Math.Sqrt(3)) * l)); 
+0

Tôi thực sự không thực sự thêm một phương pháp để tạo lưới, chỉ là một minh chứng về cách đặt tam giác đầu tiên và các nước láng giềng của nó. Tôi không chắc chắn cách bạn muốn mở rộng lưới (có nhiều cách). Nếu nó giúp sau đó đánh dấu nó như vậy sẽ được tốt đẹp :) – asimes

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