按鼠标点击点放大的算法似乎不对

Coordinator
Mar 30, 2012 at 4:34 AM

我看到是改变先setcurrentwindow,然后放大resolution到800,然后再把currentwindow变回来。

 

应该是直接把currentwindow变成放大后所应该观察的值域范围。然后preparecurrentdata,不用改变resolution

resolution的含义是屏幕上能够显示多少个统计点,所以是个常量。

 

currentwindow是观察的值域范围,所以放大窗口后,观察的值域范围反而变小了,这可以从我原来的放大算法里面看到。

 

Coordinator
Mar 30, 2012 at 4:52 AM

补充一下,我原来的放大算法基本是可用的。

目前要做的和原来唯一不一样的就是观察窗口的计算。

 

原来的算法在CWindowViewer里面的GetWindow。你们查找一下哪里引用了它就可以了。

现在的算法无非是首先计算windowsize(和我原来算法一样的)

observingwindow.start=hitpoint-windowsize/2;

observingwindow.end=hitpoint+windowsize/2-1;

这样就可以了。就是以鼠标点击点为观察中心的窗口。

 

 

 

 

Coordinator
Mar 30, 2012 at 1:25 PM

学长,二维显示目前就是按800个观察点显示的,所以resolution改为了800

然后放大所取值域,我和冰杰目前定的是以双击点为中心,左右的一段范围,就是以鼠标点击为观察中心啊   

Coordinator
Mar 30, 2012 at 4:25 PM
Edited Mar 30, 2012 at 4:34 PM
jwj666 wrote:

学长,二维显示目前就是按800个观察点显示的,所以resolution改为了800

然后放大所取值域,我和冰杰目前定的是以双击点为中心,左右的一段范围,就是以鼠标点击为观察中心啊   

这样做的是不对的,二维是二维,你生成二维数据应该另行用其他的cache,而不应该用chromepairdata里面的cache。

这样会覆盖掉现有的值。导致后面很多的依赖都不对了。我目前的快速算法也是依赖于cache的resolution不会动态改变的

你把分辨率设为800.计算后CurrentCache = new CalculationCache[Resolution];这里面就有800个元素。(下面我列出了有问题的代码)

然后又把分辨率设回512.那么以后的代码又认为CurrentCache 里面有512个元素。其他的缩放比例等等应该都和这有点关系。

所以对整体的影响很大。 这个程序的特点是,就算你错了,也很那从直观上看出来,所以觉得目前看起来没问题不见得没问题。的确比较麻烦,所以改动chromepairdata相关的东西一定要慎之又慎,要把每个字段搞清楚含义才能改。因为很难有效地检验改动的正确性,尤其是ui显示部分。

所以我才写了用平凡算法验证的代码。

   ChromePairData.Resolution = 800;

             ValueRange OldCurrentWindow = ChromePairData.Data[z].CurrentWindow;
             ChromePairData.Data[z].CurrentWindow = currentwindow;
             ChromePairData.Data[z].PrepareCurrentData();

             accumulations = ChromePairData.Data[z].GetAccumulations();
             ChromePairData.Resolution = 512;
             ChromePairData.Data[z].CurrentWindow = OldCurrentWindow

Coordinator
Mar 31, 2012 at 2:35 AM

奥,对,我明白了,覆盖了原来的值,那我在chromepairdata里面在添加一个新的cache用于计算放大缩小,这样可以吧,这个程序是这样,就算错了也很难验证,我考虑欠缺。

Coordinator
Mar 31, 2012 at 2:42 AM

学长,解决覆盖问题,我可不可以先取出cache里面的值,用完cache之后我在将值赋回去,之前只是将数量512改回去,对应的值没有更改

Coordinator
Mar 31, 2012 at 3:00 AM
Edited Mar 31, 2012 at 3:02 AM
jwj666 wrote:

学长,解决覆盖问题,我可不可以先取出cache里面的值,用完cache之后我在将值赋回去,之前只是将数量512改回去,对应的值没有更改

你的想法是没问题,但是最好别做这种tricky的操作。

因为这很令人费解,属于patch类型的。对于代码的可读性,可维护性很不利。

fastCalculation里面有一个Prepare函数

他就是可以接受传入参数的,可以满足你的需求。你可以把它改为public的然后自己调用。

其实之所以会出现这种尴尬情况,也是我当初的代码耦合性太强,没考虑这个函数的通用性。所以没有把它移出来。

现在这个fastCalculation部分可以解决这个问题。

Coordinator
Mar 31, 2012 at 4:01 AM

好,那我把代码整合到那里边去

Coordinator
Mar 31, 2012 at 4:02 AM
Edited Mar 31, 2012 at 4:03 AM
jwj666 wrote:

好,那我把代码整合到那里边去

应该不存在代码整合问题吧?只要调用就行了。fastcalculation最好别动,那个类我还没最终完成,是为了高速计算直方图存在的。

Coordinator
Mar 31, 2012 at 4:06 AM

恩,我在看看那个cs文件,我们目前只停留在解决问题的基础上,对于写代码的一些规则性的东西还不大懂,这方面得麻烦学长多指导了

Coordinator
Mar 31, 2012 at 6:56 AM
jwj666 wrote:

恩,我在看看那个cs文件,我们目前只停留在解决问题的基础上,对于写代码的一些规则性的东西还不大懂,这方面得麻烦学长多指导了

嗯。这方面我也是慢慢才养成习惯的,当初也是不注意。其实你说的挺准确。

“解决问题”相当于算法,“理清思路,表达清晰”相当于代码的结构方面的精炼。

前者是学生时代的重点,后者以后工作了会很重要。现在我提得这些只是最基本的,

相信你们工作以后的要求会严格的多。比如命名规范,单元测试等。

你们如果有意加强一下,我倒是可以给一些建议。这个有时间可以面谈。

Coordinator
Mar 31, 2012 at 7:43 AM

建议建一个叫2ddata的类,里面模仿chromepairData。有resolution。calculationCache【】 cache。这里两个成员。

有个方法叫prepare,在里面调用我提到的fastcalculation的prepare,这样就解耦了,不至于代码之间互相影响。