Showing posts with label Programming. Show all posts
Showing posts with label Programming. Show all posts

27 Oct 2022

Python Tip: Get Variable Name in Python (type of reflection?)

收藏到CSDN网摘




Sometimes, you may want to get the variable name itself as a string while writing Python code. For instance, if you are going to write 'a = 2', is there a convenient way of getting the variable name '"a"' by calling a function using 'a' as the parameter? The short answer is YES.

17 Jun 2021

Image 2 ASCII - ascii art generator

收藏到CSDN网摘

Converting images to ASCII, aka. ASCII art, has been explored by developers long time ago back to the time of DOS age. It is more about having fun but there are also some really good publications around this topic. Someone implemented online services to convert uploaded images to ASCII art like THIS one

The first answer under THIS QUESTION has a very detailed explanation and experiments of different approaches to this problem. A simple and straightforward approach is to do a pixel-2-text mapping from the image the the result ASCII text file. To avoid making the text file overcrowded, developers use to have some carefully selected character lists to reduce the intense level (number of chars used). So the process is more like a classification process: 

(1) find out which category the current pixel falls into; 
(2) pick up the character that represents the current category; 
(3) walking through the image pixel by pixel and repeat the process to generate the result text file.

3 Apr 2020

C++ Tips: Get All System Environment Variables

收藏到CSDN网摘

It's very common that you might need to get/edit/delete a system environment variable from time to time. In one of my previous post, I shared two functions that could get a system environment variable by its name or get all system environment variables in a map<string,string>. However, the function didn't return ALL variables if you checked here as shown in the screenshot.




In this post, I made another function that can obtain all system environment variables from the list.

C++ Tips: Grab Current Username and Datetime using C++

收藏到CSDN网摘
From time to time, the current username and datetime need to be obtained in code for either saving system logs or debugging the code. If you are working in Windows like me, there are two functions available to do this. The first is GetUserName() in WinBase.h and the other is localtime() (and strftime() for formatting) in time.h (or  ). All you need to do is to include them in your header and call those functions when needed.

Here we go!

21 Nov 2016

The Hardest 8-Puzzle

收藏到CSDN网摘
If you are working on any 8-puzzle related tasks, try your method with the following initial board which is considered to be the hardest to solve. Actually, it requires 31 moves to solve.

8 6 7
2 5 4
3 0 1

Someone may prefer empty/space rather than using 0. But the concept keeps the same.

6 Jul 2015

Python Tips - Easiest Transpose of a Matrix

收藏到CSDN网摘

涉及科学计算时,转置(Transpose)是一个非常常用的操作.Python中使用list comprehension可以非常简单的操作矩阵.例如下面的代码可将原始矩阵转置:

11 Jul 2013

Union Find并查集

收藏到CSDN网摘


union find并查集是数据结构与算法问题中经常碰到的典型数据结构,作为二十世纪最伟大的十个算法之一(不知道是谁评的),在很多问题中都有非常独到的应用.例如判断某2个点是否连通(迷宫路径问题).普林斯顿的在线课程数据结构与算法第一章讲的就是它,而且由浅入深,逐步实现了有一个普通的实现到最后的加权优化实现以极大压缩生成树的高度来实现高效判断.下面是python实现的代码:

5 Jul 2013

Spiral Matrix: 螺旋矩阵2

收藏到CSDN网摘


以前写过2个关于螺旋矩阵的帖子,分别是matlab方法python的模拟填空法,都是从左上角开始生长.在checkio的一道题中需要生成从中心开始螺旋生长的矩阵.方法还是类似于模拟填空法.这次需要判断的不再是到达边界转向,而是根据目前的方向,判断下一方向的位置是否为空,如果为空就转向继续写,与人工填写完全一致.需要注意的是中心位置的选取根据size的奇偶性有一些差别.

3 Jul 2013

Shortest path 迷宫寻路

收藏到CSDN网摘


走迷宫是acm经常出现的一类问题,有多重方法可以解决,例如A*,广度优先搜索,深度优先搜索等.广度优先搜素可以保证一旦找到路径,必定为最短路径.
广度优先搜索的实例如下(在12*12的迷宫中从(1,1)走到(10,10),边界是围墙,0为可通过,1为不可通过):

25 Apr 2013

c++ vector删除重复元素

收藏到CSDN网摘
vector元素去重,有3个办法,
1. copy到set,然后再copy回去
2. 利用unique函数实现,但是需要排序,会破坏元素顺序
3. 遍历判断

6 Apr 2013

c++实现split函数

收藏到CSDN网摘
python中的split函数非常好用(java,javascript,vb等语言也有提供),c++中的find,find_first_of,find_first_not_of...等函数也有其优点,但是分割字符串是个非常常见的问题,实现一个类似的函数供以后调用,会非常方便.

21 Sept 2012

Python Tips: wxPython的按钮及工具栏事件绑定

wxPython,作为python GUI编程为数不多的库,是采用c++编写wxWidget的python绑定.使用起来非常方便,可以跨平台.对于所有的界面元素都采用ID来进行事件绑定.这样有一个好处,就是对于toolbar中的item和菜单的一一对应,无需增加代码,只要添加tool item到toolbar的时候,选择跟菜单项一样的ID即可.

3 Aug 2012

NYOJ 15 括号匹配(二)



NYOJ 15 括号匹配(二)

描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的

31 Jul 2012

NYOJ 10 Skitting

NYOJ 10 求最长下降坡度.


描述
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。

5 Jul 2012

C++ Tips: include guard 之 #pragma once与#ifndef的区别


在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
方式一:

#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif

方式二:

#pragma once
... ... // 一些声明语句

1 Mar 2011

Python OpenGL绑定的按键处理

ESC处理必须用
key=='\033',虽然\033等于十六进制的\0x1b,但是用十六进制不行.
大体类似如下流程处理:
if key=='a':
pass
elif key=='s':
pass
elif key=='d':
pass
elif key=='c':
pass
elif key=='x':
pass
elif key=='r':
pass
elif key=='\033': # ESC
exit()
elif key=='+' or key=='=':
pass
elif key=='-':
pass
else:
pass

25 Feb 2011

python Bezier Curve Class

Bezier Curve:
Quadratic

Cubic

Quartic

为了学习Bezier曲线生成算法,分别用python和matlab写了遍计算过程.
Bezier曲线次数比控制点个数少1,所以对于高阶曲线没有一一对比,仅用2次曲线做了对比(2d和3d的情况)

用python的numpy和matplotlib这2个库.
验证只验证了2次曲线.分别用逐点计算(上面三个图)的方法和bezier类的方法作比较,
三维曲线需要用matplotlib的插件Axes3D.
效果图:(点击看大图)
前2个分别用逐点计算和推导,从第3个是用类直接生成,可以看出一模一样.
4,5是测试类的2个方法:单独加点和加点的list,最后一个是测试3D bezier曲线

matlab由于矩阵运算非常方便,没有构造类,直接用matrix计算,为了跟python比较.
略去了前2个,3-6跟python一样.
效果图:(点击看大图)

计算方法参考






参考网站
http://en.wikipedia.org/wiki/Bezier_Curve#Constructing_B.C3.A9zier_curves
http://www.ibiblio.org/e-notes/Splines/Bezier.htm

5 Feb 2011

Sikuli New AutoHotkey



项目主页Project Sikuli

What's SIKULI?

Sikuli is a visual technology to automate and test graphical user interfaces (GUI) using images (screenshots). Sikuli includes Sikuli Script, a visual scripting API for Jython, and Sikuli IDE, an integrated development environment for writing visual scripts with screenshots easily. Sikuli Script automates anything you see on the screen without internal API's support. You can programmatically control a web page, a Windows/Linux/Mac OS X desktop application, or even an iphone or android application running in a simulator or via VNC.

24 Jan 2011

OpenGL显示字符

假如要显示的文字全部是ASCII字符,则总共只有0到127这128种可能,因此可以预先把所有的字符分别装到对应的显示列表中,然后在需要时调用这些显示列表。
Windows系统中,可以使用wglUseFontBitmaps函数来批量的产生显示字符用的显示列表。函数有四个参数:

第一个参数是HDC,学过Windows GDI的朋友应该会熟悉这个。如果没有学过,那也没关系,只要知道调用wglGetCurrentDC函数,就可以得到一个HDC了。具体的情况可以看下面的代码。
第二个参数表示第一个要产生的字符,因为我们要产生0到127的字符的显示列表,所以这里填0。
第三个参数表示要产生字符的总个数,因为我们要产生0到127的字符的显示列表,总共有128个字符,所以这里填128。
第四个参数表示第一个字符所对应显示列表的编号。假如这里填1000,则第一个字符的绘制命令将被装到第1000号显示列表,第二个字符的绘制命令将被装到第1001号显示列表,依次类推。我们可以先用glGenLists申请128个连续的显示列表编号,然后把第一个显示列表编号填在这里。
还要说明一下,因为wglUseFontBitmaps是Windows系统特有的函数,所以在使用前需要加入头文件:#include
#include 
// ASCII字符总共只有0到127,一共128种字符
#define MAX_CHAR        128
void drawString(const char* str) {
    static int isFirstCall = 1;
    static GLuint lists;
    if( isFirstCall ) { // 如果是第一次调用,执行初始化
                         // 为每一个ASCII字符产生一个显示列表
         isFirstCall = 0;
         // 申请MAX_CHAR个连续的显示列表编号
         lists = glGenLists(MAX_CHAR);
         // 把每个字符的绘制命令都装到对应的显示列表中
         wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
     }
     // 调用每个字符对应的显示列表,绘制每个字符
    for(; *str!='\0'; ++str)
         glCallList(lists + *str);
}
显示列表一旦产生就一直存在(除非调用glDeleteLists销毁),所以我们只需要在第一次调用的时候初始化,以后就可以很方便的调用这些显示列表来绘制字符了。
绘制字符的时候,可以先用glColor*等指定颜色,然后用glRasterPos*指定位置,最后调用显示列表来绘制。

void display(void) {
     glClear(GL_COLOR_BUFFER_BIT);
     glColor3f(1.0f, 0.0f, 0.0f);
     glRasterPos2f(0.0f, 0.0f);
     drawString("Hello, World!");
     glutSwapBuffers();
}

字体修改
void selectFont(int size, int charset, const char* face) {
    HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
        charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
    HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);
    DeleteObject(hOldFont);
}

调用
void display(void) {
    selectFont(48, ANSI_CHARSET, "Comic Sans MS");

    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(1.0f, 0.0f, 0.0f);
    glRasterPos2f(0.0f, 0.0f);
    drawString("Hello, World!");

    glutSwapBuffers();
}

6 Jan 2011

VS2008 OpenGL 配置


方式一:----->
第一步,选择一个编译环境
现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev- C++等,它们都是支持OpenGL的。我选择Visual Studio 2008作为学习OpenGL的环境。
第二步,安装GLUT工具包
GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。
Windows环境下的GLUT下载地址:(大小约为150k)
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
Windows 环境下安装GLUT的步骤:
1、将下载的压缩包解开,将得到5个文件
2、把glut.h复制到x:\Program Files\Microsoft\Visual Studio 9.0\VC\include\GL文件夹中,如果没有GL这个文件夹则可以自己新建一个。
3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(即与include并排的lib文件夹下)。
4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32 文件夹内。
第三步,建立一个OpenGL工程
选择 File->New->Project,然后选择Win32 Console Application,(不是 win32 application).选择一个名字,然后按OK。
在弹出的对话框左边点Application Settings,找到Empty project 并勾上,选择Finish。然后向该工程添加一个代码文件,取名为“OpenGL.c”,注意用.c来作为文件结尾。
搞定了,就跟平时的工程没什么两样的。

第一个OpenGL程序
一个简单的 OpenGL程序如下:(注意,如果需要编译并运行,需要正确安装 GLUT,安装方法如上所述)
#include 
void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow(" 第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}
该程序的作用是在一个黑色的窗口中央画一个白色的矩形。下面对各行语句进行说明。

首先,需要包含头文件#include ,这是GLUT的头文件。
本来OpenGL程序一般还要包含,但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含。

然后看main函数。
int main(int argc, char *argv[]),这个是带命令行参数的main函数,各位应该见过吧?没见过的同志们请多翻翻书,等弄明白了再往下看。
注意main函数中的各语句,除了最后的return之外,其余全部以glut开头。这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍。
1、glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。其格式比较死板,一般照抄这句 glutInit(&argc, argv)就可以了。
2、 glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。更多信息,请自己Google。当然以后的教程也会有一些讲解。
3、glutInitWindowPosition,这个简单,设置窗口在屏幕中的位置。
4、 glutInitWindowSize,这个也简单,设置窗口的大小。
5、glutCreateWindow,根据前面设置的信息创建窗口。参数将被作为窗口的标题。注意:窗口被创建后,并不立即显示到屏幕上。需要调用glutMainLoop才能看到窗口。
6、 glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。(这个说法不够准确,但准确的说法可能初学者不太好理解,暂时这样说吧)。
7、glutMainLoop,进行一个消息循环。(这个可能初学者也不太明白,现在只需要知道这个函数可以显示窗口,并且等待窗口关闭后才会返回,这就足够了。)

在glutDisplayFunc函数中,我们设置了“当需要画图时,请调用myDisplay函数”。于是myDisplay函数就用来画图。观察 myDisplay中的三个函数调用,发现它们都以gl开头。这种以gl开头的函数都是OpenGL的标准函数,下面对用到的函数进行介绍。
1、 glClear,清除。GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西,但这里不作介绍。
2、 glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标。
3、glFlush,保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。其作用跟fflush(stdout)类似。
===============================================================
这个时候会有一个控制台和一个窗口,如果不想让它显示这个控制台,则要以文件中加入
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
===============================================================
方式二:----->
1、建工程同一。
2、把所需要的头文件和.lib文件都放在工程下
3、在源文件中这样引用:
   #pragma comment( lib, "glut32.lib")
  
   #include "glut.h"
当然,想加入哪个lib或是.h就把它写在这里就OK了。

注:#pragma comment(lib,"glut32.lib")表示链接glut32.lib这个库。
和在工程设置里写上链入glut32.lib的效果一样,不过这种方法写的
程序别人在使用你的代码的时候就不用再设置工程settings了。

强烈推荐此法。