[線性代數][作業] 旋轉矩陣
Linear Algebra: Programing Homework 2
2012/11/29
題 目:給定一個三角形,其頂點座標為:(-50,0)、(0,0)、(50,100),,依下列案例要求對三角形做出相對應的向量旋轉運算,並輸出變換後的三角形頂點座標以及向量變換矩陣
加分條件:若以圖形介面,將三角形的變化顯示出來即可加10分。
輸 入:檔名為input.txt的檔案,內容為:
旋轉的度數
輸 出:檔名為output.txt的檔案,內容為:
(1). 為案例中指定的向量變換矩陣,每個column之間以TAB分隔,每個row之間以斷行符號分隔。
(2). 變換後的座標,一個 row 表示一個座標 ( x座標 , y座標 )
收件時間:12/20 24:00以前(未避免網路壅塞,請儘早上傳,不接受遲交)
評分說明:
1. 一個測試案例(下述案例)執行正確,給60分
2. 兩個測試案例(未給)執行正確,給80分
3. 三個測試案例(未給)執行正確,給100分
4. 避免因浮點數運算造成的誤差,測試數據的計算過程中不會出現無限小數,四捨五入至小數點第二位。
若轉換過程中以分數計算並表示結果,助教將斟酌加分。
抄襲者雙方則以零分計算。
輸入範例 |
檔 名: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,不接受遲交。
Port:21
User∕Password:lahomework∕9876543210
請勿上傳含病毒之檔案。
若FTP無法使用請寄信至 w29697146@gmail.com 王耀賢
dennislinorz@gmail.com 林志浩 通知助教。
或是直接至A310實驗室找助教
[上傳相關規定]
1. 將所有程式檔案與執行檔壓縮上傳至各作業目錄。
2. 如程式執行需特殊環境或額外說明,請一併將說明文件加入壓縮檔後上傳。
3. 檔案命名規則如下
**_%%.zip 或 **_%%.rar
**:學號。
%%:作業編號,有更新上傳就將編號累加。
例:第一次作業請上傳至FTP的HW02目錄下,檔名為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();
}
}