0

プロット上の 2 点間の距離を計算する必要があります。

この必要性を達成するために、以下の方法を使用しています。私は他の方法を試しましたが、ポイントが実際にプロットされているのはこれだけです。他のメソッドでは、常に 0 を返します。

-(CPTLayer *)dataLabelForPlot:(CPTPlot *)plot recordIndex:(NSUInteger)index 


  NSDecimal plotPoint[2];
        CPTPlotSpace *thePlotSpace = plot.plotSpace;
        CPTPlotArea *thePlotArea   = plot.plotArea;
        CPTCoordinate independentCoord = (NO ? CPTCoordinateY : CPTCoordinateX);

        plotPoint[independentCoord] = [plot cachedDecimalForField:CPTBarPlotFieldBarLocation recordIndex:0];

        CGPoint basePoint;

        basePoint = [plot convertPoint:[thePlotSpace plotAreaViewPointForPlotPoint:plotPoint] fromLayer:thePlotArea];

        plotPoint[independentCoord] = [plot cachedDecimalForField:CPTBarPlotFieldBarLocation recordIndex:1];

        CGPoint basePoint2;

        basePoint2 = [plot convertPoint:[thePlotSpace plotAreaViewPointForPlotPoint:plotPoint] fromLayer:thePlotArea];


        int valor; 
        valor =  basePoint2.x - basePoint.x;

上記のコードはほとんど常に機能しますが、上記のコードから得られる EXC_BAD_ACESS を取得しています。

コードにコメントすると、exc_bad_acess は発生しません

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000004
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   Foundation                      0x32f7be56 NSIntegerDivide + 98
1   Foundation                      0x32f7f9e0 NSDecimalDivide + 216
2   InfoTOS007                      0x000e198c CPTDecimalDivide (CPTUtilities.m:496)
3   InfoTOS007                      0x000fd0c8 -[CPTXYPlotSpace     viewCoordinateForViewLength:linearPlotRange:plotCoordinateValue:] (CPTXYPlotSpace.m:384)
4   InfoTOS007                      0x000fd66a -[CPTXYPlotSpace plotAreaViewPointForPlotPoint:] (CPTXYPlotSpace.m:449)
5   InfoTOS007                      0x000bea38 -[GraficoEmbarqueDescarga dataLabelForPlot:recordIndex:] (GraficoEmbarqueDescarga.m:249)
6   InfoTOS007                      0x000ce192 -[CPTPlot relabel] (CPTPlot.m:1016)
7   InfoTOS007                      0x000cb868 -[CPTPlot layoutSublayers] (CPTPlot.m:402)
8   QuartzCore                      0x34272f92 CA::Layer::layout_if_needed(CA::Transaction*) + 210
9   QuartzCore                      0x34277114 CA::Context::commit_transaction(CA::Transaction*) + 220
10  QuartzCore                      0x34276e50 CA::Transaction::commit() + 308
11  QuartzCore                      0x3426ed7e CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 50
12  CoreFoundation                  0x344deb44 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 12
13  CoreFoundation                  0x344dcd80 __CFRunLoopDoObservers + 252
14  CoreFoundation                  0x344dd0da __CFRunLoopRun + 754
15  CoreFoundation                  0x344604d6 CFRunLoopRunSpecific + 294
16  CoreFoundation                  0x3446039e CFRunLoopRunInMode + 98
17  GraphicsServices                0x30d4bfc6 GSEventRunModal + 150
18  UIKit                           0x32a2873c UIApplicationMain + 1084
19  InfoTOS007                      0x000b3468 main (main.m:16)
20  InfoTOS007                      0x000b340c start + 32
4

1 に答える 1

2

問題は、plotPoint[dependentCoord] を決して設定しないことであると思われるため、未定義の値をプロット座標に変換しようとしています。グラフの範囲内の値に設定するだけです。心配するのが X 軸だけであれば、Y 軸の値は関係ありません。以下をコンパイルしようとはしていませんが、正しく見えます。

  NSDecimal plotPoint[2];
  CPTPlotSpace *thePlotSpace = plot.plotSpace;
  CPTPlotArea *thePlotArea   = plot.plotArea;
  CPTCoordinate independentCoord =  CPTCoordinateX;
  CPTCoordinate dependentCoord =  CPTCoordinateY;

  plotPoint[independentCoord] = [plot cachedDecimalForField:CPTBarPlotFieldBarLocation recordIndex:0];
  plotPoint[dependentCoord] = CPTDecimalFromInt(1);

  CGPoint basePoint;
  basePoint = [plot convertPoint:[thePlotSpace plotAreaViewPointForPlotPoint:plotPoint] fromLayer:thePlotArea];

  plotPoint[independentCoord] = [plot cachedDecimalForField:CPTBarPlotFieldBarLocation recordIndex:1];
   CGPoint basePoint2;
   basePoint2 = [plot convertPoint:[thePlotSpace plotAreaViewPointForPlotPoint:plotPoint] fromLayer:thePlotArea];

    int valor; 
    valor =  basePoint2.x - basePoint.x;
于 2012-07-04T00:58:45.883 に答える