IGV改动demo

2020-10-03  本文已影响0人  byejya

先复现画箭头的

再用translate方法变形

1.试验drawPolygon方法:

3

可见,画法是从给的点123->1封闭连接。

因此,如果箭头在左,需要

1 2

和最上面的xpoly一样。

尝试:

2

之前因为没搞对连接顺序而画的乱七八糟。因此需要注意的是drawPolygon是根据给出的xy每个点从头到尾依次封闭连接。它相当于每步只把前后两个点连接成线。

接下来尝试affinetransform,将直线扭曲成曲线。

3 4

改动lw即可按像素缩放宽度。每个值/scale可实现缩放。

之前计划按polygon和trans的方法画弧线因为不好实现而放弃,转而使用弧线和线段加粗的方式画图。可以打到一样的效果

代码记录,防止以外丢失:

import javax.swing.*;

import java.awt.*;

public class arc {

public static void main(String[] args) {

/*

        * 在 AWT 的事件队列线程中创建窗口和组件, 确保线程安全,

        * 即 组件创建、绘制、事件响应 需要处于同一线程。*/

        EventQueue.invokeLater(new Runnable() {

@Override

            public void run() {

// 创建窗口对象

                MyFrame frame =new MyFrame();

// 显示窗口

                frame.setVisible(true);

}

});

}

/**

    * 窗口

    */

    public static class MyFrame extends JFrame {

public static final String TITLE ="Java图形绘制";

public static final int WIDTH =250;

public static final int HEIGHT =300;

public MyFrame() {

super();

initFrame();

}

private void initFrame() {

// 设置 窗口标题 和 窗口大小

            setTitle(TITLE);

setSize(WIDTH,HEIGHT);

// 设置窗口关闭按钮的默认操作(点击关闭时退出进程)

            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

// 把窗口位置设置到屏幕的中心

            setLocationRelativeTo(null);

// 设置窗口的内容面板

            MyPanel panel =new MyPanel(this);

setContentPane(panel);

}

}

/**

    * 内容面板

    */

    public static class MyPanel extends JPanel {

private MyFrame frame;

public MyPanel(MyFrame frame) {

super();

this.frame = frame;

}

/**

        * 绘制面板的内容: 创建 JPanel 后会调用一次该方法绘制内容,

        * 之后如果数据改变需要重新绘制, 可调用 updateUI() 方法触发

        * 系统再次调用该方法绘制更新 JPanel 的内容。

        */

        @Override

        protected void paintComponent(Graphics g) {

super.paintComponent(g);

// 3. 圆弧 / 扇形

            drawArc(g);

}

/**

        * 3. 圆弧 / 扇形

        */

        private void drawArc(Graphics g) {

frame.setTitle("3. 圆弧 / 扇形");

Graphics2D g2d = (Graphics2D) g.create();

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setColor(Color.RED);

Graphics2D g1d = (Graphics2D) g.create();

g1d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

g1d.setColor(Color.green);

Graphics2D g3d = (Graphics2D) g.create();

g3d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

g3d.setColor(Color.blue);

///以上:只g2d和g1d两个就行,但是为了排除错误我有加了g3d,没必要。1d画环形,2d画弧形即可。

            //  画demo

            //L  intron的长度。这里我选的int型的最后都要math.ceil一下,以防除时候出现小数。另外弧形不能出现小数需要改写一下。不精确。

            //intron 用gff3read读取。

            int L=180;

int x0=0;

int x1=180;

//pi

            int pi=3;

//l1  第一条read的长度和起始位置。此x能直接用,原来igv画图里也使用到了。

            int l1=100;

int lx1=30;

int lx2=130;

//l2  第二条read

            int l2 =60;

int lx3=120;

int lx4=180;

//cita  intron长度换算成角度

            int cita =360/L;

//r intron变化成环的r和其外切矩形

            int w=0;

int h=0;

int r =L/pi;

w=h=2*r;

//lw gap lw线宽 gap两条线画图的间隔

            int lw =4;

int gap =lw/2;

//draw l1

            int cita1=lx1*cita;

int cita2=lx2*cita;

//g2d.drawArc(40, 40, 140, 140, -9, 120);

//// arcx arcy

            double expendx=(lw+gap)*Math.sin(45.0);

int epx=(int)Math.ceil(expendx);

int arcx=60-epx;

int arcy=arcx;

////arcw arch

            int arcw=w+2*epx;

int arch=arcw;

/// arcx1 arcy1 arcw1 arcw2

            int arcx1=60-2*epx;

int arcy1=arcx1;

int arcw1=w+2*(2*epx);

int arch1=arcw1;

int cita3=lx3*cita;

int cita4=lx4*cita;

//draw

            g1d.drawArc(60,60, w, h,0,360);

g2d.setStroke(new BasicStroke(lw));

g2d.drawArc(arcx,arcy,arcw,arch,cita1, (cita2-cita1));

g3d.setStroke(new BasicStroke(lw));

g3d.drawArc(arcx1,arcy1,arcw1,arch1,cita3,(cita4-cita3));

g2d.dispose();

}

}

}

上一篇下一篇

猜你喜欢

热点阅读