当前位置: 首页 > 知识库问答 >
问题:

使用图形。在绘图上缩放变换

林冥夜
2023-03-14

目前,我开发了一个 ChartControl,在我看来它运行得很好,但现在我处于能够缩放绘制的信号以便更好地分析的地步。

目前,我像这样计算所需的点数:

for (int i = 0; i < PointsCount; i++){
    xAxisPoint = xAxisOP.X + i * (xAxisWidth / PointsCount);
    yAxisPoint = yAxisHeight * data[i].Point / Divisor;

    if(yAxisPoint > yAxisHeight){
        yAxisPoint = yAxisHeight;  
    }

    if(yAxisPoint < -yAxisHeight){
        yAxisPoint = -yAxisHeight;
    }

    Points[i] = new PointF(xAxisPoint, yAxisOP.Y + yAxisPoint);
}

if(zoom){
    graphics.ScaleTransform(0.2f*ZoomFactor, 0.2f*ZoomFactor);
}

using (Pen plotPen = new Pen(plotColor, 1)){
    graphics.DrawLines(plotPen, Points);
}

但问题是:当它放大时,缩放太大,并且绘制在我的控制范围之外。

有没有办法指定应该缩放(缩放)的区域?

共有1个答案

董庆
2023-03-14

对于最后一个问题:有没有办法指定应该缩放/缩放的区域?您需要 SetClipTranslateTransformScaleTransform 的组合。

下面是一个示例。

它使用

  • 显示缩放图形的目标矩形缩放Tgt区域
  • 鼠标位置缩放原点所在的原点
  • 一个浮点
  • 放大因子,一个正浮点数。

初始值:

Rectangle zoomTgtArea = new Rectangle(300, 500, 200, 200);
Point zoomOrigin = Point.Empty;   // updated in MouseMove when button is pressed
float zoomFactor = 2f;

仅放大部分图形的诀窍是显示图形两次,一次正常显示,一次使用图形对象的转换。

让我们试试:

private void pictureBox_Paint(object sender, PaintEventArgs e)
{
    // normal drawing
    DrawStuff(e.Graphics);

    // for the movable zoom we want a small correction
    Rectangle cr = pictureBox.ClientRectangle;
    float pcw =  cr.Width / (cr.Width - ZoomTgtArea.Width / 2f) ;
    float pch =  cr.Height / (cr.Height - ZoomTgtArea.Height / 2f) ;

    // now we prepare the graphics object; note: order matters!
    e.Graphics.SetClip(zoomTgtArea );
     // we can either follow the mouse or keep the output area fixed:
    if (cbx_fixed.Checked)
        e.Graphics.TranslateTransform( ZoomTgtArea.X -  zoomCenter.X * zoomFactor,
                                        ZoomTgtArea.Y -  zoomCenter.Y * zoomFactor);
    else
        e.Graphics.TranslateTransform(  - zoomCenter.X * zoomFactor * pcw,
                                        - zoomCenter.Y * zoomFactor * pch);
    // finally zoom
    e.Graphics.ScaleTransform(zoomFactor, zoomFactor);

    // and display zoomed
    DrawStuff(e.Graphics);
}

我使用的DrawStuff很简单:

void DrawStuff(Graphics g)
{
    bool isZoomed = g.Transform.Elements[0]!= 1   
                ||  g.Transform.OffsetX != 0 | g.Transform.OffsetY != 0;
    if (isZoomed) g.Clear(Color.Gainsboro);   // pick your back color

    // all your drawing here!
    Rectangle r =  new Rectangle(10, 10, 500, 800);  // some size
    using (Font f = new Font("Tahoma", 11f))
        g.DrawString(text, f, Brushes.DarkSlateBlue, r);
}

它唯一的额外功能是清除背景,因此普通绘图不会通过缩放版本发光。

我看看:

 类似资料:
  • 我正在制作一个带有Swing的GUI,它使用仿射变换来缩放绘制在JInternalFrame上的图形2D对象。问题是,它在当前状态下有问题,我不知道为什么。 为什么我的代码不能正确伸缩?为什么图形会在调整大小时“跳转”到面板顶部? 以下是我的独立示例:

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 改善这个问题 我想用Java绘制图形(节点和边)。但是,由于我不知道该怎么做,因此在开始之前我想寻求一些建议。 我应该怎么做? 使用Graphics2D包,对吗? 节点的标签怎么样?我应该使用诸如drawString之类的东西并手动处理所有“

  • 我最近在折线图中添加了放大和平移功能。现在我想添加一个复位按钮或类似的东西,当按下图形回到正常位置/形状时。目前,我正在绘制动态数据,每10秒更新一次。 先谢谢你。

  • 本文向大家介绍PHP实现绘制3D扇形统计图及图片缩放实例,包括了PHP实现绘制3D扇形统计图及图片缩放实例的使用技巧和注意事项,需要的朋友参考一下 1、利用php gd库的函数绘制3D扇形统计图 效果: 2、对图片进行缩放 效果:

  • 问题内容: 我是一个狂热的程序员,但是今天是我的第一堂Java课。 使用上面的代码,我想在窗口上写一个句子,但是它永远不会写。我究竟做错了什么? 编辑:没关系-油漆一定是油漆。我深表歉意。 问题答案: 在给定的代码中,您想要的是 一个工作示例供您参考:

  • 我想绘制以按钮为中心的缩放SVGPath节点。按钮应该保持其大小与图像大小无关,SVGPaths应该保留它们的相对位置。 问题是按钮图像被移位了。

  • 我有一个无法解决的问题... 我有一个自定义的imageview,它会根据更大的尺寸改变大小——包含该视图的布局的宽度或高度。它的工作方式总是适合布局。 它的布局是这样的: 我正在努力实现的是,我有尺寸为1000x1000px的原始地图。在这张地图上,我有一些点。我必须在Android上显示这张地图,并在与原始地图相同的点上添加其他视图。 所以举个例子: > 原始地图为1000x1000px 我用

  • 问题内容: 我在向JPanel添加图形时遇到问题。如果我更改从panel.add(new graphics()); 到frame.add(new graphics()); 并且不要将JPanel添加到JFrame,黑色矩形会出现在JFrame上。我只是无法让黑色矩形出现在JPannel上,并且想知道是否有人可以帮助我。 问题答案: 自定义组件为0x0 px。