1. 程式人生 > >java 反射 畫Sin、Cos函式曲線

java 反射 畫Sin、Cos函式曲線

package test;



import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;



public class Test3 {

	String str1 = "111";

	String str2 = "222";

	String str3 = "333";

	char[] c = {'a','b','c','d'};

	public Test3(String str){

		this.str3 = str;

	}

    public static void main(String[] args) {

    	Test3 t = new Test3("333");

    	Class c = t.getClass();

    	Method[] m = c.getDeclaredMethods();

    	Field[] f = c.getDeclaredFields();

    	for(int i=0;i<f.length;i++){

    		if(f[i].getType()==char[].class) continue;

			try {

				//列印所有屬性值  如果是靜態屬性,可以直接用Test3.class代替

				System.out.println(f[i].getName() + "  " + f[i].get(t).toString());

			} catch (IllegalArgumentException e) {

				e.printStackTrace();

			} catch (IllegalAccessException e) {

				e.printStackTrace();

			}

    	}

    	for(int i=0;i<m.length;i++){

    		if(m[i].getReturnType()==String.class){

    			try {

    				//列印所有為String的方法返回值

					System.out.println(m[i].getName() + "  " +m[i].invoke(t));

				} catch (IllegalArgumentException e) {

					e.printStackTrace();

				} catch (IllegalAccessException e) {

					e.printStackTrace();

				} catch (InvocationTargetException e) {

					e.printStackTrace();

				}

    		}

    	}

        TriFunc tri = new TriFunc();

        // 生成一塊25×100的畫布

         Canvas canvas = new Canvas(30, 100);

        // 畫sin曲線,週期為2

        tri.drawSin(canvas, 2);

        canvas.printCanvas();  

        System.out.println();

        canvas.reset();

        // 畫cos曲線,週期為2

        tri.drawCos(canvas, 2);

        canvas.printCanvas();

    }

	public String getStr1() {

		return str1;

	}

	public String getStr2() {

		return str2;

	}

	public String getStr3() {

		return str3;

	}

	@Override

	public int hashCode() {

		final int PRIME = 31;

		int result = super.hashCode();

		result = PRIME * result + ((str1 == null) ? 0 : str1.hashCode());

		result = PRIME * result + ((str2 == null) ? 0 : str2.hashCode());

		result = PRIME * result + ((str3 == null) ? 0 : str3.hashCode());

		return result;

	}

	@Override

	public boolean equals(Object obj) {

		if (this == obj)

			return true;

		if (!super.equals(obj))

			return false;

		if (getClass() != obj.getClass())

			return false;

		final Test3 other = (Test3) obj;

		if (str1 == null) {

			if (other.str1 != null)

				return false;

		} else if (!str1.equals(other.str1))

			return false;

		if (str2 == null) {

			if (other.str2 != null)

				return false;

		} else if (!str2.equals(other.str2))

			return false;

		if (str3 == null) {

			if (other.str3 != null)

				return false;

		} else if (!str3.equals(other.str3))

			return false;

		return true;

	}

}



class TriFunc {



    /**

     * 畫sin曲線

      * @param canvas 畫布

      * @param period 曲線週期

      */

    public void drawSin(Canvas canvas, double period) {        

        char[][] chars = canvas.getCanvas();

        // x 軸的比率

         double xRatio = (2 * period * Math.PI) / (canvas.getWidth() - 1);

        // y 軸的放大倍率

         int yMulti = (canvas.getHeight() - 1) / 2;

        for(int i = 0; i < canvas.getWidth(); i++) {

            // 將陣列索引對映為橫座標值

              double k = (i - canvas.getWidth() / 2) * xRatio;

            // 將sin值對映為陣列索引

              int h = yMulti - (int)Math.round(Math.sin(k) * yMulti);

            chars[h][i] = Canvas.FILL_CHAR;

        }

    }

    

    /**

     * 畫cos曲線

      * @param canvas 畫布

      * @param period 曲線週期

      */

    public void drawCos(Canvas canvas, double period) {

        char[][] chars = canvas.getCanvas();

        double xRatio = (2 * period * Math.PI) / (canvas.getWidth() - 1);

        int yMulti = (canvas.getHeight() - 1) / 2;

        for(int i = 0; i < canvas.getWidth(); i++) {

            double k = (i - canvas.getWidth() / 2) * xRatio;

            int h = yMulti - (int)Math.round(Math.cos(k) * yMulti);

            chars[h][i] = Canvas.FILL_CHAR;

        }

    }

}





class Canvas {

    

    private int height;

    private int width;

    private char[][] canvas;   

    

    // 填充字元

     public static char FILL_CHAR = '#';

    // 空白字元

     public static char BLANK_CHAR = ' ';

    

    /**

     * 構建一塊畫布

      * @param height

     * @param width

     */

    public Canvas(int height, int width) {

        // 由於需要畫座標軸,所以得采用奇數

         this.height = height % 2 == 0 ? height + 1 : height;

        this.width = width % 2 == 0 ? width + 1 : width;               

        init();

    }

    

    /**

     * 初始化畫布

      */

    private void init() {

        this.canvas = new char[height][width];

        for(int i = 0; i < height; i++) {

            for(int j = 0; j < width; j++) {

                canvas[i][j] = BLANK_CHAR;

            }

        }

        addAxis();

    }

    

    /**

     * 新增座標軸

      */

    private void addAxis() {

        // 新增橫座標

         int y = height / 2;

        for(int x = 0; x < width; x++) {

            canvas[y][x] = '-';

        }

        // 新增縱座標

         int xx = width / 2;

        for(int yy = 0; yy < height; yy++) {

            canvas[yy][xx] = '|';

        }

        // 新增原點

         canvas[y][xx] = '+';

    }

    

    /**

     * 輸出畫布

      */

    public void printCanvas() {

        for(int i = 0; i < height; i++) {

            for(int j = 0; j < width; j++) {

                System.out.print(canvas[i][j]);

            }

            System.out.println();

        }

    }

    

    /**

     * 清空畫布

      */

    public void reset() {

        init();

    }

    

    public int getHeight() {

        return height;

    }

    public int getWidth() {

        return width;

    }



    public char[][] getCanvas() {

        return canvas;

    }    

}

相關推薦

java 反射 SinCos函式曲線

package test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;

IOS中正弦sincos函式運算的坑

在ios中可以完全相容c的函式,所以第一步要匯入 #include <math.h> 這樣就可以使用c的一系列函數了 c中有cos,sin,tan但是我們傳入度數後都得不到想到的結果,問題是: 我們傳入的是度數,而函式所需的引數是弧度,這裡就要我們做一個度--弧度的轉換

matplotlib繪製sincos曲線

import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文標籤 plt.rcParams['axes.unicode

數學基礎知識之Sincos

由於在控制檯裡面畫圓的時候,SetCursorPosition該函式只接受Int型別的資料  所以位置就會四捨五入,這樣就畫的不正確  所以採用Uniyt中的2D介面繪製的 主要是鞏固math.sin

C++中tanatansincos等三角函式用法的程式碼演示及結果,注意角度和弧度的轉換!

進行相機座標系相關公式推導時,經常碰到三角函式的使用。時間一長就生疏,碰到問題再查,很費時間。所以就總結一下,也希望能幫到更多的人。下面就通過簡練的程式碼,把常用的cos、sin、tan、atan等通過程式碼及結果都說清楚。注意弧度和角度的區別!!! 1、程式碼 #include <

正割餘割正弦餘弦正切餘切之間的關係的公式 seccsc與sincostancot之間的各種公式

1、倒數關係 tanα ·cotα=1 sinα ·cscα=1 cosα ·secα=1 2、商數關係 tanα=sinα/cosα cotα=cosα/sinα 3、平方關係 sinα²+cosα²=1 1+tanα²=secα² 1+cotα²=cscα² 4、求

java反射的工具類的函式集合

import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifi

大白話說Java反射:入門使用原理

  java的反射機制就是增加程式的靈活性,避免將程式寫死到程式碼裡, 例如: 例項化一個 person()物件, 不使用反射, new person(); 如果想變成 例項化 其他類, 那麼必須修改原始碼,並重新編譯。 使用反射: class.forName

Java反射 操作ConstructorMethodField

前面已經介紹,通過反射獲取Class中各種元素 連結:Java反射 獲取Class及Class對應資訊 看之前一定要看連結裡獲取Class對應資訊,因為有很多混淆的獲取方法 本篇是簡單介紹通過 Constructor(構造器)建立物件 Method(方法)呼叫方法 Field

pycharm中實現簡單的sincos函式曲線圖

1.需要下載相應的package,主要就是numpy和matplotlib;具體程式碼如下: #!/usr/bin/env python # encoding: utf-8 ''' @author: yangxin @contact: [email protect

Java的輸入和輸出if...else if...else判斷Java中列印陣列Java中陣列排序檢視函式方法的原始碼命令列引數

Java的輸入和輸出: 輸入: import java.util.Scanner Scanner s = new Scanner(System.in); //通過new Scanner(System.in)建立一個Scanner物件,控制檯會一直等待輸入,直到敲回車鍵

Java反射之getFields()getDeclaredFields()方法

在Java開發中,有兩種獲取欄位的方式:getFields()和getDeclaredFields()。 兩者區別: getFields():獲取某個類的所有的公共(public)的欄位,包括父類中的欄位 getDeclaredFields():獲取某個類的所有宣告的欄位,即包括publ

Java反射 操作ConstructorMethodField以及陣列

前面已經介紹,通過反射獲取Class中各種元素 看之前一定要看連結裡獲取Class對應資訊,因為有很多混淆的獲取方法 本篇是簡單介紹通過 Constructor(構造器)建立物件 Method(方法)呼叫方法 Field(欄位)操作成員變數 Array(陣列)

使用java反射操作類的建構函式,成員變數和成員方法

在java.lang.reflect包中有三個類Field,Method,Constructor.分別描述域,方法,構造器。參考API,關於這三個類的說明。 在執行時使用反射分析物件,如果訪問的是私有域或是私有方法,私有建構函式,會丟擲IllegalAccessExce

快速sincos 函式計算

void _SSE2_SinCos(float x, float* s, float* c)  // any x{__asm{  movss xmm0, x   movaps xmm7, xmm0   movss xmm1, _ps_am_inv_sign_mask   movss xmm2, _ps_am_

Sin()函式影象

主題:畫sin(x)函式影象 java 程式碼如下: import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.eve

java反射中Parameter的getName函式如何得到引數名

如果jdk是1.8一下或者沒有設定帶引數名編譯,那麼Parameter的getName函式只會返回arg0,arg1,arg2......想要得到真正的引數名,得勾選一下帶引數名編譯的設定:這樣就ok了為什麼要勾選帶引數編譯的設定呢?想到前幾天學的詞法分析和語法分析才知道,變

Java反射列印類的資訊,包括類的成員函式成員變數(只獲取成員函式)

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ClassUtil { /** *

Java 基礎 -- 泛型集合IO反射

array ger read let input 處理 chm 媒體 files 計劃把 Java 基礎的有些部分再次看一遍,鞏固一下,下面以及以後就會分享自己再次學習的一點筆記!不是有關標題的所有知識點,只是自己覺得模糊的一些知識點。 1.  對於泛型類而言,你若沒有指明

Java反射及 IoC原理內省機制

sso http CA truct 的區別 tps demo inf 限定 JAVA反射及IoC原理、JAVA內省 1. 反射 反射是框架設計的靈魂,使用前提:必須先得到代表的字節碼的Class,Class類用於表示.class文件(字節碼文件)。 1.1 反射概述