IGV改动demo
先复现画箭头的
再用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();
}
}
}