2011-01-01 4 views
-6

У меня есть эта полярная функция:Как построить полярную функцию на декартовой сетке?

r = A/log(B * tan(t/2 * N)

где А, В, Н являются произвольными параметрами и т угла тета в полярной системе координат.

Пример графа для A=8, B=0.5, N=4

Sample graph

Как я могу построить эту функцию на декартовой координатной сетке, так что я получаю изображение, как показано выше?

благодаря

+0

-1. Серьезно посмотрите http://en.wikipedia.org/wiki/Polar_coordinate_system и узнайте, как преобразовать (r, t) в (x, y). Если у вас есть вопрос программирования, отправьте его снова в SO. – ja72

+1

@Raoul, ваш вопрос не содержал ссылок на какой-либо язык программирования. Дело в том, что ваш вопрос - это NPR, и только ваш ответ и правильная маркировка делают это (едва). Кроме того, призывать кого-то к рывкам за то, что вы правы, здесь неприемлемо. – Will

+0

Язык программирования нерелевантный псевдокод достаточно хорош, но я просил, как рисовать непрерывную кривую, как изображение, которое я разместил, поэтому по существу я хотел знать, как реализовать плоттер, который создал изображение, которое я показал. Я не понимаю, как это оффтоп. Также я не вижу, как jalexiou прав, потому что он полностью пропустил вопрос о том, что очевидно. Может быть, вопрос может быть не достаточно ясным, но кто-то извергает кого-то из-за того, что это неприемлемое поведение от моего POV, и я называю это тем, что есть, если вам это нравится или нет. –

ответ

2

Неполный образец псевдокода, но вы должны получить идею:

for t in [0, 2pi): 
    r = /* whatever you got depending on t */ 
    x = r * cos(t) 
    y = r * sin(t) 
    draw line to (x,y) 
+1

Спасибо за ваш ответ, но я сожалею, что это не очень полезно. Это не даст гладкой кривой. Как вы это сделаете именно с этим псевдокодом? Также, пожалуйста, уточните, как итерации от 0 до 2pi, потому что это непрерывный диапазон действительных чисел, это не так просто, как это делает ваш псевдокод. –

+4

Ответ точно соответствует вопросу. Никогда в исходных вопросительных ответах, что ответ должен дать гладкую кривую (по каким критериям?) – ja72

+0

@ jalexiou Я написал «так что я получаю изображение, подобное тому, которое было выше» –

1

Хорошо, я понял. Пример кода Java:

import static java.lang.Math.*; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.image.BufferedImage; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 


public class TestPolarPlot { 
    public static void main(String[] args) { 
    final int width = 512; 
    final int height = 512; 
    BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); 
    Graphics g = img.getGraphics(); 
    g.setColor(Color.black); 
    g.fillRect(0, 0, width, height); 
    g.setColor(Color.white); 
    final double A = 8; 
    final double B = 0.5; 
    final double N = 4; 
    final double scale = 128; 
    final double zoom = 50; 
    final double step = 1/scale; 
    Point last = null; 
    final Point origin = new Point(width/2, height/2); 

    for (double t = 0; t <= 2*PI; t+= step) { 
     final double r = zoom * polarFunction(t, A, B, N); 
     final int x = (int)round(r * cos(t)); 
     final int y = (int)round(r * sin(t)); 
     Point next = new Point(x, y); 
     if (last != null) { 
      g.drawLine(origin.x + last.x, origin.y + last.y, 
       origin.x + next.x, origin.y + next.y); 
     } 
     last = next; 
    } 

    JFrame frame = new JFrame("testit"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(new JLabel(new ImageIcon(img))); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

    public static double polarFunction(double t, double A, double B, double N) { 
     return A/log(B * tan(t/(2 * N))); 
    } 
} 

Я не ожидал, что это создаст гладкие кривые, но это работает очень хорошо.

alt text alt text

+2

Итак, «я понял это», вы имеете в виду « я понял, что я сказал, что это бесполезно, попробовал, и выяснил, что это действительно работает ». – cHao