`
mathfox
  • 浏览: 36515 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

画图时遇到的问题?可以说是一个算法题吧。

阅读更多

坐标系是这个样的

 

-------------------------------->

|

|

|

|

|

|

+

 

就是y轴向下的

 

求这样顺序的坐标点

 

 1,  2,   5,  10,
 3,  4,   6,  11,
 7,  8,   9,  12,
 13, 14,  15, 16

这样一直画下去

 

1 的坐标是 (1, 1),

2的坐标是 (2, 1),

3的坐标是 (1, 2),

 

 怎么求第几个数据的实际坐标呢?

 

分享到:
评论
30 楼 WenBin_Zhou 2010-05-23  
翻了页才知道 已近有这么多答案 呵呵!
29 楼 WenBin_Zhou 2010-05-23  
<p>1.矩阵是Cnn型(n行n列),矩阵的规律是对角线上的数据多是1的平方,2的平方,3的平方.... <br>2.如C22的矩阵的排列是这样的:先确定对角 1 和 4,在最大的对角数据上顺序从上都到下填充列:2,列填完在顺序从左到右填充列,3 <br>  对于C33也是这样:确定对角 1 ,4,9,在C22的数据的基础上(也就是从5开始),在9的列上顺序填充行:5,6 ,在9的行上从左到右填充7,8 </p>
<p>  ......</p>
<p> </p>
<p>3.所以递归解决时合理的,但是也不需要用</p>
<p> </p>
<p>4.假设要找出的数据时m,(1=&lt;m&lt;=N,总的矩阵为N介的)</p>
<p>5.初次确定m的行列(m为开平方开不尽的情况,开平方为整数的在对角线上,如4的坐标为(2,2)):</p>
<p>    m开平方取整数部分:x   ([square(m)])</p>
<p>   // m开平方取小数第一位:y</p>
<p>    (1). x&lt;x.5   m在(x+1)列</p>
<p>    (2).x&gt;x.5    m在(x+1)行</p>
<p>                </p>
<p>   比如6这个数,6开平方是2.4...多,所以它的横坐标是3;</p>
<p>6.在确定m的具体位置:</p>
<p>    (1)  m在(x+1)列    (x+1)^2(对角数据)-m(求的数据)-(x+1-1)(行上数据的个数)=DIFF(m与(x+1)行相隔的行数);</p>
<p>          所以m的横坐标是:(x+1)-DIFF</p>
<p>    (2)   m在(x+1)行    (x+1)-{(x+1)^2(对角数据)-m(求的数据)};</p>
<p> </p>
<p>9当然要求的是在第四象限,所以求到的行数做负数处理 ,其实没用到什么东东</p>
<p> </p>
<p> </p>
28 楼 chs1987 2010-05-22  
f(m,n)的表达式如下:
f(m,n) = m^2  (m=n)
f(m,n) = (m-1)^2 + m + n - 1 (m>n)
f(m,n) = (n-1)^2 + m (m<n)
找出满足条件(x-1)^2 <f(m,n) <= x^2的x值,然后就好做了
27 楼 renwolang521 2010-05-22  
先 图画出来 找规律,很快就能明白,计算的方法很笨,你可以再调节。
方法:
1. 找出这个数的点在哪个正方形上
2. 找出在这个正方形的哪条边上(横向的 or 纵向)
3. 在推算其具体坐标
26 楼 renwolang521 2010-05-22  



    function getPosition(num){
        var x =0,y=0;
        
        // 1, 2 太特殊去掉
        if(num == 1){
            return {x:1,y:1};
        }else if(num == 2){
            return {x:2,y:1};
        }

        // 开方
        var sqrt = Math.sqrt(num);
        
        var side = Math.ceil(sqrt);
        var step = Math.floor(sqrt)
        
        // 如果恰好是某个数的平方
        if(side == step){
            return {x:side,y:side};
        }
        
        var sideSquare = side*side;
        var stepSquare = step*step;

        // 求差值
        var dvalue = sideSquare - num;
        
        // 如果差值大于 step 就在纵向的那条边上
        if(dvalue > step){
            x = side;
            y = num-stepSquare;
        }
        // 如果差值小于 step 就在横向的那条边上
        else{
            y = side;
            x = side - dvalue;
        }
        
        return {x:x,y:y};
    }
25 楼 reghere1 2010-05-22  
Sub f1()

m = InputBox("Please enter your number!")

For i = 1 To m
    For j = 1 To m
   
        If i = j Then   ' 对角线
        Cells(i, j).Value = i * i
        Cells(i, j).Interior.ColorIndex = 35
        End If
       
        If i > j Then   ' 下三角
        Cells(i, j).Value = i * (i - 1) + j
        Cells(i, j).Interior.ColorIndex = 28
        End If
       
        If i < j Then   ' 上三角
        Cells(i, j).Value = (j - 1) * (j - 1) + i
        Cells(i, j).Interior.ColorIndex = 14
        End If
   
    Next j
Next i

End Sub
24 楼 czwlucky 2010-05-21  
<pre name="code" class="js">var N = 23; // 22,30,78
var n = Math.floor(Math.sqrt(N));

var c = N - n*n;
if( c == 0 )
{
    y = x = n;
}
else if( c &lt;= n )
{
    y = c;
    x = n + 1;
}
else
{
    y = n + 1;
    x = c - n;
}</pre>
 
23 楼 kenken0y 2010-05-21  
def xy_of_n(n)
  m = Math.sqrt(n).to_i
  left = n - m*m
  if left==0
    x,y = m,m
  elsif left <= m
    x = m+1
    y = left
  else
    x = (left-m)
    y = m+1
  end
  return x,y  
end

require 'test/unit'
class XY_OF_N_Test < Test::Unit::TestCase
  def test_1_17
    assert_equal([1,1], xy_of_n(1))
    assert_equal([2,1], xy_of_n(2))
    assert_equal([1,2], xy_of_n(3))
    assert_equal([2,2], xy_of_n(4))
    assert_equal([3,1], xy_of_n(5))
    assert_equal([3,2], xy_of_n(6))
    assert_equal([1,3], xy_of_n(7))
    assert_equal([2,3], xy_of_n(8))
    assert_equal([3,3], xy_of_n(9))
    assert_equal([4,1], xy_of_n(10))
    assert_equal([4,2], xy_of_n(11))
    assert_equal([4,3], xy_of_n(12))
    assert_equal([1,4], xy_of_n(13))
    assert_equal([2,4], xy_of_n(14))
    assert_equal([3,4], xy_of_n(15))
    assert_equal([4,4], xy_of_n(16))
    assert_equal([5,1], xy_of_n(17))
  end
end
22 楼 zhouhailong 2010-05-21  
<p>function createData(length){<br>   var array=[];<br>   var num=0;<br>   for(var i=0;i&lt;length;i++){<br>    array[i]=[];<br>    for(var j=0;j&lt;i;j++){<br>     array[j][i]=++num;<br>    }<br>    for(var j=0;j&lt;i;j++){<br>     array[i][j]=++num;<br>    }<br>    array[i][j]=++num;<br>   }<br>   return array;<br>  }</p>
21 楼 xinchi21cool 2010-05-21  
<p>其实这个题很有意思的,不用循环也可以解决,我把它画成图(见附件)就好明白了,然后我写了个如下的程序用来解答:</p>
<p> </p>
<pre name="code" class="java">import java.util.Scanner;

public class MathTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入一个数字:");
int num = scan.nextInt();
Point p = getPointByNum(num);
System.out.println(num + "的坐标是:(" + p.getX() + "," + p.getY() + ")。");
}

/**
* 根据一个数字获取其坐标
* @param num
* @return 对应的坐标
*/
public static Point getPointByNum(int num) {
double numSqrtDou = Math.sqrt(num);
int numSqrtInt = (int) numSqrtDou;
int x = 0, y = 0;
x = numSqrtInt + 1;//默认X轴为平方数的下一个X值(默认以图中竖线的坐标为基础)
y = num - numSqrtInt * numSqrtInt;//Y默认为其原值减去其最接近最小的平方数(默认以图中竖线的坐标为基础)
if (numSqrtInt == numSqrtDou) {//如果此数开方后没有余数,则为某数的平方,即X等于Y(从图中可见)
x = numSqrtInt;
y = x;
} else if (numSqrtInt * (x) &lt; num) {//否则就是横线上的坐标对应的数了(把X值与Y值对调一下就OK了,从图中可看出来)
int temp = x;
x = y;
y = temp;
}
return new Point(x, y);
}
}
//自己写的Point类,类库的是双精度型的
class Point {
private int x;
private int y;

public Point() {
}

public Point(int x, int y) {
this.x = x;
this.y = y;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}
}</pre>
20 楼 lyw985 2010-05-21  
public class PositionTest {
	public static void main(String[] args) {
		for (int i = 1; i <= 100; i++) {
			showPosition(i);
		}
	}

	public static void showPosition(int number) {
		int i = 0;
		for (;; i++) {
			if (i * i == number) {
				System.out.println(number + "的坐标是(" + i + "," + i + ")");
				return;
			}
			if (i * i > number) {
				break;
			}
		}
		int preNumber = (i - 1) * (i - 1);
		int nextNumber = i * i;
		int more = number - preNumber;
		if (more <= (nextNumber - preNumber - 1) / 2) {
			System.out.println(number + "的坐标是(" + i + "," + more + ")");
		} else {
			System.out
					.println(number + "的坐标是("
							+ (more - (nextNumber - preNumber - 1) / 2) + ","
							+ i + ")");
		}
	}
}
19 楼 weihaohust 2010-05-21  
数据d的实际坐标为:
记n为进位的sqrt(d)。
n^2-d           坐标
>=0 && <n       (n+d-n^2, n)
>=n && <2n     (n, 2n+d-n^2-1)
测试一下,d=12,则n=4
4^2-12 = 4 为(>=4 && < 2*4) 坐标为(4, 2*4+12-16-1)=(4, 3)
d = 14,则n=4
4^2-14 = 2 为(>=0 && < 4) 坐标为(4+14-16, 4) = (2,4)
18 楼 mathfox 2010-05-21  
<p><img style="vertical-align: text-top;" src="http://dl.iteye.com/upload/attachment/252872/b212e008-5873-332d-992e-3ad071e50688.png" alt="position" width="550" height="350"></p>
<pre name="code" class="java">
package test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ShowPosition extends JFrame {
private static final long serialVersionUID = 8556157323225368961L;

public ShowPosition() {
init();
}

private void init() {
this.setTitle("Position");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().add(new MatrixPanel(30));
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension dim = tk.getScreenSize();
int x = 500;
int y = 300;
this.setBounds((dim.width - x) / 2, (dim.height - y) / 2, x, y);

}
/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
new ShowPosition().setVisible(true);
}
});
}

}

class MatrixPanel extends JPanel {
private static final long serialVersionUID = 6469609788716371402L;
private int W = 60;
private int H = 20;

private int pad = 10;

private int sum;
public MatrixPanel(int sum) {
this.sum = sum;
this.setBackground(Color.gray.darker().darker());
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;


for (int i = 1; i &lt; sum + 1; ++i) {
Point p = getPoint(i);
int left = p.x * pad + (p.x - 1) * W;
int top = p.y * pad + (p.y - 1) * H;

g2.setColor(Color.yellow);
g2.fillRect(left, top, W, H);
g2.setColor(Color.black);
g2.drawString(String.format("%d | (%d, %d)", i, p.x, p.y), left + 3, top + 15);
}


}

Point getPoint(int i) {
int x = (int) (Math.sqrt(i) - (int) Math.sqrt(i) == 0 ? Math
                 .sqrt(i)
                 : Math.sqrt(i) - (int) Math.sqrt(i) &gt;= 0.5 ? (i - (int) Math
                         .sqrt(i)
                         * ((int) Math.sqrt(i) + 1))
                         : ((int) Math.sqrt(i) + 1));
         int y = (int) (Math.sqrt(i) - (int) Math.sqrt(i) == 0 ? Math
                 .sqrt(i)
                 : Math.sqrt(i) - (int) Math.sqrt(i) &gt;= 0.5 ?
                         ((int) Math.sqrt(i) + 1): (i - (int) Math
                                 .sqrt(i)* ((int) Math.sqrt(i) )));

         return new Point(x, y);
}



}</pre>
<pre name="code" class="java">做了个简单的试验,谢谢抛哥,有上面的个兄弟了。</pre>
17 楼 sjynt131 2010-05-21  
public static void main(String[] args) {
		for (int i = 1; i <= 64; i++) {
			int x = (int) (Math.sqrt(i) - (int) Math.sqrt(i) == 0 ? Math
					.sqrt(i)
					: Math.sqrt(i) - (int) Math.sqrt(i) >= 0.5 ? (i - (int) Math
							.sqrt(i)
							* ((int) Math.sqrt(i) + 1))
							: ((int) Math.sqrt(i) + 1));
			int y = (int) (Math.sqrt(i) - (int) Math.sqrt(i) == 0 ? Math
					.sqrt(i)
					: Math.sqrt(i) - (int) Math.sqrt(i) >= 0.5 ? 
							((int) Math.sqrt(i) + 1): (i - (int) Math
									.sqrt(i)* ((int) Math.sqrt(i) )));
			System.out.println(x+":"+y);
		}
	}
16 楼 抛出异常的爱 2010-05-21  
qiaojianwei2006 写道
抛出异常的爱 写道
mathfox 写道
抛出异常的爱 写道
n^2>f(x,y)>(n-1)^2
n>x y =n
n>y x=n


抛兄,你这式子,也没有表达式啊。

我感觉这个序列写的是有规律的,不过怎么写不出表达式呢。


                    
值 = F(x,y) 72212
可以得出n  (开方取整)  243
f(x,y)-(n)^2 363
大于等于ntrueturefalse
则y =n+1 ,x =  f(x,y) -(n)^2 -(n)x =1,y=3 x=1,y=4NAn
小于n falsefalseTRUE
则x = n+1,y= f(x,y) -(n)^2NaNNaNx=4,y=3


抛哥,22的坐标按照你的这个式子,应该改是x=1,y=5吧?

是错了 在n=4时
x= 4 + 1 =5
y= 22-16-4 =2

再化简一下
y = f(x,y)%n
1  2   5  1017
3  4   6  1118
7  8   9  1219
13 14  15 1620
2122232425
15 楼 tianlang0101 2010-05-21  
我是来围观 大牛的.
14 楼 qiaojianwei2006 2010-05-21  
抛出异常的爱 写道
mathfox 写道
抛出异常的爱 写道
n^2>f(x,y)>(n-1)^2
n>x y =n
n>y x=n


抛兄,你这式子,也没有表达式啊。

我感觉这个序列写的是有规律的,不过怎么写不出表达式呢。


                    
值 = F(x,y) 72212
可以得出n  (开方取整)  243
f(x,y)-(n)^2 363
大于等于ntrueturefalse
则y =n+1 ,x =  f(x,y) -(n)^2 -(n)x =1,y=3 x=1,y=4NAn
小于n falsefalseTRUE
则x = n+1,y= f(x,y) -(n)^2NaNNaNx=4,y=3


抛哥,22的坐标按照你的这个式子,应该改是x=1,y=5吧?
13 楼 qiaojianwei2006 2010-05-21  
抛哥,还是没看懂,郁闷。。。。。。。。。。。
12 楼 抛出异常的爱 2010-05-21  
mathfox 写道
抛出异常的爱 写道
mathfox 写道
抛出异常的爱 写道
第一次用table标签不太熟。
改好了再看一下


郁闷,看不明白,请问,n代表的的序列值,x是横坐标,y是纵坐标吧

N表示开方取整。



我去,看明白了,这也太牛between A AND C了吧, 开方都想出来了。

你是怎么做到的啊?

你还记得以前有个面试题的帖子?
[url]http://loveexception.iteye.com/blog/548840
[/url]这个两差不多。
你的更简单一点吧
我记得还有人算出过式子来呢
11 楼 mathfox 2010-05-21  
抛出异常的爱 写道
mathfox 写道
抛出异常的爱 写道
第一次用table标签不太熟。
改好了再看一下


郁闷,看不明白,请问,n代表的的序列值,x是横坐标,y是纵坐标吧

N表示开方取整。



我去,看明白了,这也太牛between A AND C了吧, 开方都想出来了。

你是怎么做到的啊?

相关推荐

    基于画图算法的WSN节点定位算法

    这种转换使得定位问题可以利用成熟的画图算法求解。 - **优化布局**:接着,利用类似Kamada-Kawai的画图算法,通过迭代优化过程,调整图中节点的位置,使其符合边的权重约束,即保持节点间的实际距离接近其在图中...

    仿windows的画图程序+图形学算法

    标题中的“仿windows的画图程序+图形学算法”指的是创建一个类似Windows操作系统自带的“画图”程序,采用图形学的基本原理和算法来实现其功能。这样的程序通常包括了像素操作、图形绘制、颜色处理等核心部分,是...

    vc一个画图工具.rar_Vc_vc 画图_vc 画图程序_扫描算法_画图

    "VC一个画图工具.rar" 是一个使用Visual C++(简称VC)开发的简易画图程序,适合初学者理解图形学的基本概念和扫描算法。这个程序提供了一个平台,让用户能够绘制各种图形,并且可以看到这些图形是如何通过编程逻辑...

    Bresenham像素画图算法

    算法初始时设置一个错误值E,并根据当前点的位置更新E,决定下一个像素点的位置。 1. 初始化:`x = x0`, `y = y0`, `dx = x1 - x0`, `dy = y1 - y0` 2. 如果`dx`绝对值更大,那么交换`x`和`y`,同时交换`dx`和`dy` ...

    利用bresenham算法实现画图程序

    ### 图形学实验报告:利用Bresenham算法实现画图程序 #### 实验背景与目标 本实验旨在深入探索图形学领域中的基础算法——Bresenham算法,并通过实践应用,实现画图程序的开发。Bresenham算法是一种用于绘制直线、...

    多算子模拟退火算法在TSP问题中实现,OpenGL实现画图仿真

    TSP是一个经典的NP完全问题,目标是找到一条访问每个城市一次并返回起点的最短路径。 **多算子模拟退火算法** 在传统的模拟退火算法中,通常只有一个单一的操作算子,如随机交换两个相邻城市的顺序。但在“多算子...

    Qt写的遗传算法加画图程序

    在信息技术领域,遗传算法(Genetic Algorithm,GA)是一种受到生物进化理论启发的优化方法,而Qt则是一个跨平台的C++图形用户界面应用程序开发框架。本篇文章将深入探讨如何利用Qt进行遗传算法的实现,并结合图形化...

    winform画图程序,算法均为自行编写的

    标题中的“winform画图程序”指的是使用Windows Forms(WinForms)框架开发的图形用户界面应用,这是一个在C#编程语言中常见的用于构建桌面应用程序的工具。WinForms提供了丰富的控件和API,允许开发者创建交互式的...

    画图(直线圆等)插补算法

    这个过程可以理解为在图形的起点和终点之间进行数据点的“填充”,使得最终的连接点能够形成一个连贯的图像。 对于直线的插补,通常使用的是Bresenham算法,这是一种快速且简单的方法,特别适用于像素级别的绘制。...

    c# 画图 画板 工具 实现多种算法

    在C#编程环境中,开发一个画图工具,尤其是涉及到计算机图形学的各种算法,是一项非常有挑战性和实用性的任务。这个项目不仅能够帮助学习者深入理解图形学的基本原理,还可以为课堂演示、课程设计和毕业设计提供宝贵...

    一些matlab中的画图算法

    对于matlab简单画图很有帮助,主要是画别人的结果。很有用的哦

    基于C语言实现线画图元生成算法【100012533】

    在计算机图形学中,线画图元生成算法是基础且重要的组成部分,特别是在使用低级编程语言如C语言进行编程时。本项目的核心是实现DDA(Digital Differential Analyzer)算法和Bresenham直线算法,这两种算法都用于在...

    首次适应算法 最佳适应算法 循环首次适应算法 

    当一个进程请求内存时,系统会遍历所有的空闲分区,选择第一个足够大的空闲分区来满足进程的内存需求,并将其分配给进程。这种方法的优点是简单且快速,但缺点是可能会导致大块的内存被分割成小碎片,因为总是优先...

    画图笔迹优化算法.txt

    画图涂鸦抗锯齿,笔迹优化,是用C++ 根据底层win32 api得出来的一套算法,有需要的同学可以做一个研究学习之用,有问题可以在提出来大家探讨一下

    面试算法题及技巧.zip

    总的来说,“面试算法题及技巧.zip”这个资源可能涵盖了以上提到的所有内容,为面试者提供了一个全面的准备指南。通过深入学习和实践,不仅能够提高面试的成功率,也有助于在实际工作中解决复杂的技术问题。

    WIN11新版画图问题解决

    标题 "WIN11新版画图问题解决" 涉及的是在Windows 11操作系统中遇到的与默认画图应用程序(MSPaint)相关的技术问题。Windows 11是微软发布的最新一代桌面操作系统,它引入了许多界面和功能的更新。然而,随着新系统...

    C#画图工具开源 实现各种图像特效算法

    这个开源的C#画图工具不仅提供了丰富的图像处理功能,还为开发者提供了一个实践和学习图像处理技术的平台。无论你是想提升现有的图像应用,还是对图像处理有兴趣,这个工具都能帮助你深入理解图像特效的实现原理,并...

    高一:算法概念练习题及答案[精选].docx

    8. **故障检测算法**:当面临问题时,如电线故障,一个有效的算法是从最可能的原因开始排查,题目中提到的检测方法体现了这一思路。 9. **程序框图**:程序框图是表示算法流程的图形工具,具有单一入口和出口,且第...

    C++关于画图底层算法

    算法的核心在于计算一个决策变量d,以此来确定是选择当前像素点的右方还是右上方的像素点作为下一个像素点。 1. **初始化**:设定起始点坐标(x0, y0)和终点坐标(x1, y1),计算初始决策变量d、a、b等。 2. **迭代...

    制作一个简单画图工具

    【标题】制作一个简单画图工具 在计算机编程领域,创建一个简单的画图工具是一项基础且有趣的任务。这个工具能够帮助用户绘制基本图形,如圆、直线和矩形,并支持2D颜色渐变效果。这样的应用程序通常使用图形用户...

Global site tag (gtag.js) - Google Analytics