V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
platoo
V2EX  ›  程序员

c语言绘图:如何计算出一个缩放因子,以保证以任一点为圆心的圆形不会超出窗体边界?

  •  
  •   platoo · 2013-02-18 09:33:03 +08:00 · 4148 次点击
    这是一个创建于 4299 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT。假设窗体的大小为500 * 500,那么以300 * 300为圆心,半径为400的圆就会超出窗体,那么这个时候就要对其进行比例缩小,同样,如果还有一个以400*400,半径为400的圆超出窗体,怎样才能保证这两个同时使用相同的缩放因子?
    9 条回复    1970-01-01 08:00:00 +08:00
    diib
        1
    diib  
       2013-02-18 11:14:08 +08:00
    楼主没说清楚?
    看意思是要将若干矢量图形缩放到窗口?

    这个圆形方形三角形没关系吧。计算所有图形的总的矩形边界,然后根据这个边界矩形的形状和窗口矩形做比例,这个比例就应该是你要的缩放因子。
    platoo
        2
    platoo  
    OP
       2013-02-18 12:59:05 +08:00
    @diib 感谢!是2D画图。是这样的,有一个500 * 500的screen,和若干圆心不同的圆。要求所有的圆都要在窗体内完整显示出来,现在我能想通的是把圆心移动到screen的坐标原点 250 * 250,然后遍历多个圆,算出(coordinate + radius) / 500 的最大值,然后以此来计算所有圆使用的scale,也就是缩放因子。
    没明白的地方是:
    如果有一个圆,它的位置在screen的最边上,比如说450 * 450,那么算出来的缩放因子是不是对它不适用?他还是会被画出screen呢?
    diib
        3
    diib  
       2013-02-18 14:23:02 +08:00
    @platoo

    好像明白了,意思就是有若干圆c1,c2....cn,圆心都在 rect1里边,但是半径r1,r2....rn不定,需要求出一个缩放因子s,要求:所有圆心位置保持不动,半径按照s进行缩放,使所有圆能完整的包含在rect1里边?

    如果是这样的话,你的算法是不成的,不能移动圆心位置。以圆c1为例子,要根据实际,求圆心(x1,y1)到窗口的4个边距的最小值l1,然后l1/r1得到c1的缩放因子s1。

    然后遍历所有圆,得到最小的s1就是你要的因子。

    --------------------------
    如果不是上面那样,请参考我回复的第一条。
    diib
        4
    diib  
       2013-02-18 14:24:59 +08:00   ❤️ 1
    优化什么的就不讲了,只是提供思路。
    ch_linghu
        5
    ch_linghu  
       2013-02-26 10:02:48 +08:00
    我感觉可以通过计算所有圆占用的总的宽和高,形成一个外切矩形,然后将这个矩形等比例缩放到指定大小即可。这个比例就是所求比例。
    platoo
        6
    platoo  
    OP
       2013-02-27 08:20:46 +08:00
    @diib 我实现的方法是这样的:
    考虑到上、下、左、右四个方向,比较 x + r, abs(x - r), y + r, abs(y - r)的最大值,作为x、y轴的最大偏移距离。也就是说存在最大圆a,xa和ya,求出factor = xa / width(screen的半径),然后根据factor求出所有圆,缩放后的x轴,y轴,半径。
    之后进行world coordinate 到 screen coordinate的转换。
    从结果上看,是符合要求的。
    diib
        7
    diib  
       2013-02-27 09:14:50 +08:00 via Android
    看了你的做法才明白你的需求就是地图缩放中的全图显示问题。。。解决了就好。
    platoo
        8
    platoo  
    OP
       2013-02-28 01:59:26 +08:00
    @diib 是啊,刚接触图形这部分,很多情况自己都还描述不出来。很感谢~
    diib
        9
    diib  
       2013-02-28 07:34:33 +08:00 via Android
    如果是全图显示,可以参考1楼和5楼。
    你的算法是外切矩形法的变形。

    不用客气。^_^
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3255 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:55 · PVG 20:55 · LAX 04:55 · JFK 07:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.