2012-12-30 13:57:12Morris

[線性代數][作業] 旋轉矩陣

Linear Algebra: Programing Homework 2

2012/11/29

 

 

 

 

題  目:給定一個三角形,其頂點座標為:(-50,0)(0,0)(50,100),,依下列案例要求對三角形做出相對應的向量旋轉運算,並輸出變換後的三角形頂點座標以及向量變換矩陣

 








LA2.png





 

 

加分條件:若以圖形介面,將三角形的變化顯示出來即可加10分。

 

輸  入:檔名為input.txt的檔案,內容為:

                    旋轉的度數

 

輸  出:檔名為output.txt的檔案,內容為:

(1).    為案例中指定的向量變換矩陣,每個column之間以TAB分隔,每個row之間以斷行符號分隔。

(2).    變換後的座標,一個 row 表示一個座標 ( x座標 , y座標 )

 

 

收件時間:12/20 24:00以前(未避免網路壅塞,請儘早上傳,不接受遲交

 

 

 

 

評分說明:

1.     一個測試案例(下述案例)執行正確,給60

 

2.     兩個測試案例(未給)執行正確,給80

 

3.     三個測試案例(未給)執行正確,給100

 

4.     避免因浮點數運算造成的誤差,測試數據的計算過程中不會出現無限小數,四捨五入至小數點第二位。

若轉換過程中以分數計算並表示結果,助教將斟酌加分。

抄襲者雙方則以零分計算。

 

案例    旋轉矩陣( (0,0) 為支點,旋轉30)


 

輸入範例

檔  名:input.txt

檔案內容:

30

 

輸出範例

檔  名:output.txt

檔案內容:

Transform matrix:

 

cos(30)    -sin(30)

sin(30)    cos(30) 

 

The three coordinates:

 

( 0.00 , 0.00 )

( -93.30 , 61.60 )

( -6.70 , 111.60 )

 [程式作業繳交方式]

 

請上傳至FTP Server不接受遲交

 

IP:140.115.52.80

Port:21                                                       

User∕Passwordlahomework9876543210

 

請勿上傳含病毒之檔案。

FTP無法使用請寄信至 w29697146@gmail.com   王耀賢  

                       dennislinorz@gmail.com   林志浩    通知助教。

 

或是直接至A310實驗室找助教

 

[上傳相關規定]

 

1.      將所有程式檔案執行檔壓縮上傳至各作業目錄。

2.      如程式執行需特殊環境或額外說明,請一併將說明文件加入壓縮檔後上傳。

3.      檔案命名規則如下

 

**_%%.zip 或 **_%%.rar

 

**:學號。

%%:作業編號,有更新上傳就將編號累加。

 

例:第一次作業請上傳至FTPHW02目錄下,檔名為951234567_1.zip,後來對檔案有修改時,上傳檔名則為951234567_2.zip,以此類推,評分以最新版本為準。

 

注意 : 本次作業限使用C/C++ JAVA 編寫

 

請各位同學配合,以利分數登記。

有任何疑問請洽詢助教,謝謝各位同學。


有圖形介面肯定是用 JAVA 比較方便囉,至於寫得好不好我不曉得。
但是居然後面發現助教有搞浮點數輸入,看來真的需要有人比過 ACM-ICPC,
才懂得如何表是一個題目的 input 與 output


import javax.swing.*;
import java.awt.*;
import java.util.Scanner;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;

/**
 *
 * @author Shiang-Yun Yang
 *
 */
public class Rotate extends JFrame {
    public double px, py, qx, qy;
    public double tx, ty, ux, uy; // <point info>
    private int ox = 250, oy = 250;

    public Rotate(double n, String title) {
        this.setSize(500, 500);
        this.setResizable(false);
        this.setTitle(title);
        px = Math.cos(n) * (-50) - Math.sin(n) * 100;
        py = Math.sin(n) * (-50) + Math.cos(n) * 100;
        qx = Math.cos(n) * 50 - Math.sin(n) * 100;
        qy = Math.sin(n) * 50 + Math.cos(n) * 100;

        tx = Math.cos(n) * (-80) - Math.sin(n) * 130;
        ty = Math.sin(n) * (-80) + Math.cos(n) * 130;
        ux = Math.cos(n) * 80 - Math.sin(n) * 130;
        uy = Math.sin(n) * 80 + Math.cos(n) * 130;
    }

    public void paint(Graphics g) {
        for (int i = 0; i < 500; i++) {
            g.setColor(Color.WHITE);
            g.drawLine(i, 0, i, 500);
        }
        g.setColor(Color.BLACK);
        g.setFont(new Font("Monospaced", Font.BOLD, 15));
        g.drawLine(250, 0, 250, 500);
        g.drawLine(0, 250, 500, 250);

        g.fillOval(245, 245, 10, 10);
        g.drawString("(0,0)", 265, 265);

        int ax, ay, bx, by, cx, cy, dx, dy;
        ax = (int) Math.round(px) + ox;
        ay = oy - (int) Math.round(py);
        bx = (int) Math.round(tx) + ox;
        by = oy - (int) Math.round(ty);
        g.fillOval(ax - 5, ay - 5, 10, 10);
        g.drawString(String.format("(%.2f,%.2f)", px, py), bx, by);
        cx = (int) Math.round(qx) + ox;
        cy = oy - (int) Math.round(qy);
        dx = (int) Math.round(ux) + ox;
        dy = oy - (int) Math.round(uy);
        g.fillOval(cx - 5, cy - 5, 10, 10);
        g.drawString(String.format("(%.2f,%.2f)", qx, qy), dx, dy);
        g.drawLine(ax, ay, ox, oy);
        g.drawLine(cx, cy, ox, oy);
        g.drawLine(ax, ay, cx, cy);
    }

    public static void main(String[] args) {
        Scanner fin = null;
        PrintStream fout = null;
        try {
            fin = new Scanner(new FileInputStream("input.txt"));
            fout = new PrintStream(new FileOutputStream("output.txt"));
        } catch (Exception e) {
        }

        double n = fin.nextDouble();

        fout.println("Transform matrix:");
        fout.println("");
        fout.println("cos(" + n + ")  -sin(" + n + ")");
        fout.println("sin(" + n + ")  cos(" + n + ")");
        fout.println("");
        fout.println("The three coordinates:");
        fout.println("");
        fout.println("( 0.00 , 0.00 )");
       
        double px, py, qx, qy;
        n = n * Math.PI / 180;
        px = Math.cos(n) * (-50) - Math.sin(n) * 100;
        py = Math.sin(n) * (-50) + Math.cos(n) * 100;
        qx = Math.cos(n) * 50 - Math.sin(n) * 100;
        qy = Math.sin(n) * 50 + Math.cos(n) * 100;

        fout.printf("( %.2f, %.2f )", px, py);
        fout.println("");
        fout.printf("( %.2f, %.2f )", qx, qy);
        fout.println("");
        Rotate guiT = new Rotate(n, "Transform");
        Rotate guiO = new Rotate(0.0, "Origin");
        guiO.setVisible(true);
        guiT.setVisible(true);
        fin.close();
        fout.close();
    }
}