c语言绘图:如何计算出一个缩放因子,以保证以任一点为圆心的圆形不会超出窗体边界? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
platoo
V2EX    程序员

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

  •  
  •   platoo 2013-02-18 09:33:03 +08:00 4531 次点击
    这是一个创建于 4621 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     5120 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 09:35 PVG 17:35 LAX 02:35 JFK 05:35
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86